我正在尝试执行以下查询:

INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name='value'
);

但是这会返回一个错误。基本上我不想插入一个记录,如果记录的“名称”字段已经存在于另一个记录-如何检查新名称是否唯一?


当前回答

您正在插入而不是更新结果。 您可以在主列中定义名称列或将其设置为惟一的。

其他回答

为了克服类似的问题,我修改了表,使其具有唯一的列。用你的例子,在创建时,我会有这样的东西:

name VARCHAR(20),
UNIQUE (name)

然后在插入时使用以下查询:

INSERT IGNORE INTO train
set table_listnames='Rupert'

这个查询很有效:

INSERT INTO `user` ( `username` , `password` )
    SELECT * FROM (SELECT 'ersks', md5( 'Nepal' )) AS tmp
    WHERE NOT EXISTS (SELECT `username` FROM `user` WHERE `username` = 'ersks' 
    AND `password` = md5( 'Nepal' )) LIMIT 1

你可以使用下面的查询来创建表:

CREATE TABLE IF NOT EXISTS `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(30) NOT NULL,
    `password` varchar(32) NOT NULL,
    `status` tinyint(1) DEFAULT '0',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

注意:在尝试使用第一个查询之前,使用第二个查询创建表。

MySQL提供了一个非常可爱的解决方案:

REPLACE INTO `table` VALUES (5, 'John', 'Doe', SHA1('password'));

非常容易使用,因为您已经声明了一个唯一的主键(这里的值为5)。

您正在插入而不是更新结果。 您可以在主列中定义名称列或将其设置为惟一的。

INSERT不允许语法中的WHERE。

你可以做的是:在字段上创建一个UNIQUE INDEX,它应该是唯一的(name),然后使用:

正常插入(如果名称已经存在,则处理错误) INSERT IGNORE(如果name已经存在,将无声失败,导致警告(而不是错误)) 插入……ON DUPLICATE KEY UPDATE(如果名称已经存在,将在末尾执行UPDATE,请参阅文档)