2014-07-08 31 views
1

我是mysql的新手。请帮忙。 我有一个这样的人。唯一的主键是id如果一个密钥已经存在,请不要插入记录

id name age sex 

1. John 16 M 

2. Peter 18 K 

我想写一些sql来插入一些行给人。但是,如果表中已存在 的名称。我不插入新行。例如,如果我插入名称为John和 Peter的行。我不插入行。 我有一个变量名称var_name;

我已经搜索了很长时间的网络。 我用下面的SQL由Web

INSERT into People(name) values(var_name) where not exists(SELECT name from People 
where name = var_name) 

但SQL语法错误出来建议。为何会发生这种情况。是否有任何快速的方法来达到我的目标。

+0

的http://stackoverflow.com/questions/3164505/mysql-insert-record-if-not-exists-in-table – user3741598

+0

重复没有关系你的问题,但我有两个意见。一个是在现实生活中,更多的人可以拥有相同的名字。另一个是存储某人的年龄是有限的,因为它随着时间的推移而变化。 –

回答

0

如果您对名称的唯一约束,我相信你可以使用:

INSERT IGNORE People(name) VALUES (var_name); 
+0

你的意思是我需要改变字段'name'在我的数据库表中唯一吗? – user1386463

+0

@ user1386463那么,如果你不想重复名称值,那肯定是一个好的开始。 – Igor

6

要做到这一点,最好的方法是创建名称的唯一索引:

create unique idx_people_name on people(name) 

然后,当你插入,使用on duplicate key update

INSERT into People(name) 
    values(var_name) 
    on duplicate key update name = values(name); 

update一块确实没什么克 - 这是一个“禁用”。但是,这将逻辑放在数据库中,并强制名称必须是唯一的。

为了您的查询能够正常工作,您需要insert . . . select。该values条款不采取where声明:

INSERT into People(name) 
    select var_name 
    from dual 
    where not exists(SELECT name from People where name = var_name); 
+0

第二种方法。我想问一下,我是否需要将字段“name”更改为键? – user1386463

+0

@ user1386463。 。 。没有必要为列设置特殊名称。而且,你不想命名一列'key',因为这是MySQL中的一个保留字。 –

+0

非常感谢。我了解前两种方法。对于第三种方法。我使用下面的查询插入人(姓名)选择('彼得')不存在的地方(选择姓名 from People where name ='Peter')但是会出现sql错误。 – user1386463

相关问题