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

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

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


当前回答

工作:

INSERT INTO users (full_name, login, password) 
  SELECT 'Mahbub Tito','tito',SHA1('12345') FROM DUAL
WHERE NOT EXISTS 
  (SELECT login FROM users WHERE login='tito');

其他回答

你可以简单地使用以下方法:

INSERT INTO ... ON DUPLICATE KEY UPDATE ...

通过这种方式,您可以插入任何新的原始数据,如果有重复的数据,则替换特定的列(最好的列是时间戳)。 例如:

CREATE TABLE IF NOT EXISTS Devices (
  id         INT(6)       NOT NULL AUTO_INCREMENT,
  unique_id  VARCHAR(100) NOT NULL PRIMARY KEY,
  created_at VARCHAR(100) NOT NULL,
  UNIQUE KEY unique_id (unique_id),
  UNIQUE KEY id (id)
)
  CHARACTER SET utf8
  COLLATE utf8_unicode_ci;

INSERT INTO Devices(unique_id, time) 
VALUES('$device_id', '$current_time') 
ON DUPLICATE KEY UPDATE time = '$current_time';

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

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

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

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

工作:

INSERT INTO users (full_name, login, password) 
  SELECT 'Mahbub Tito','tito',SHA1('12345') FROM DUAL
WHERE NOT EXISTS 
  (SELECT login FROM users WHERE login='tito');

INSERT不允许语法中的WHERE。

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

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