MySQL:如果表中不存在插入logging

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

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

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

我并不是在暗示你这么做,因为Piskvor和其他人build议的UNIQUE指数是一个更好的办法,但实际上你可以做你正在尝试的:

 CREATE TABLE `table_listnames` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `address` varchar(255) NOT NULL, `tele` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; 

插入一条logging:

 INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = 'Rupert' ) LIMIT 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 SELECT * FROM `table_listnames`; +----+--------+-----------+------+ | id | name | address | tele | +----+--------+-----------+------+ | 1 | Rupert | Somewhere | 022 | +----+--------+-----------+------+ 

尝试再次插入相同的logging:

 INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = 'Rupert' ) LIMIT 1; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 +----+--------+-----------+------+ | id | name | address | tele | +----+--------+-----------+------+ | 1 | Rupert | Somewhere | 022 | +----+--------+-----------+------+ 

插入不同的logging:

 INSERT INTO table_listnames (name, address, tele) SELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp WHERE NOT EXISTS ( SELECT name FROM table_listnames WHERE name = 'John' ) LIMIT 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 SELECT * FROM `table_listnames`; +----+--------+-----------+------+ | id | name | address | tele | +----+--------+-----------+------+ | 1 | Rupert | Somewhere | 022 | | 2 | John | Doe | 022 | +----+--------+-----------+------+ 

等等…

INSERT不允许在语法中使用WHERE

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

  • 正常INSERT (并处理错误,如果名称已经存在)
  • INSERT IGNORE (如果名称已经存在,将会自动失败导致警告(而不是错误)
  • INSERT ... ON DUPLICATE KEY UPDATE (如果名称已经存在,将在最后执行UPDATE , 请参阅文档 )

工作:

 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'); 

MySQL提供了非常可爱的解决scheme:

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

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

 INSERT IGNORE INTO `mytable` SET `field0` = '2', `field1` = 12345, `field2` = 12678; 

这里的mysql查询插入logging,如果不存在,将忽略现有的相似logging。

 ----Untested---- 

如果你真的不能得到一个唯一的索引在桌子上,你可以尝试…

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

为了克服类似的问题,我已经创build了我要插入的表格来创build一个独特的列。 使用你的例子,创造我会有这样的事情:

 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 

您可以使用以下查询创build表格:

 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 ; 

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

布赖恩胡珀:你几乎达到了这一点,但你有一个错误在你的synatx。 你的插入将永远不会工作。 我testing了我的数据库,这里是正确的答案:

 INSERT INTO podatki (datum,ura,meritev1,meritev1_sunki,impulzi1,meritev2,meritev2_sunki,impulzi2) SELECT '$datum', '$ura', '$meritve1','$sunki1','$impulzi1','$meritve2','$sunki2','$impulzi2' FROM dual WHERE NOT EXISTS (SELECT datum,ura FROM podatki WHERE datum='$datum' and ura='$ura' 

我给你我的榜样。 插入与Bian Hooper所写的几乎一样,除了我从其他表中selectFROM DUAL ont。 辛德问,伊万

 insert into customer_keyskill(customerID, keySkillID) select 2,1 from dual where not exists ( select customerID from customer_keyskill where customerID = 2 and keySkillID = 1 ) 

您可以轻松使用遵循的方式:

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

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

 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'; 

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

我有一个问题,迈克build议的方法部分工作,我有一个错误Dublicate列名='0',并更改为您的查询语法为`

  $tQ = "INSERT INTO names (name_id, surname_id, sum, sum2, sum3,sum4,sum5) SELECT '$name', '$surname', '$sum', '$sum2', '$sum3','$sum4','$sum5' FROM DUAL WHERE NOT EXISTS ( SELECT sum FROM names WHERE name_id = '$name' AND surname_id = '$surname') LIMIT 1;"; 

问题在于列名。 sum3等于sum4,mysql抛出dublicate列名,我用这个语法编写了代码,

我有一个类似的问题,我需要插入多个如果不存在。 所以从上面的例子我来到这个组合…这是为了以防万一有人需要它。

注意:我不得不在MSSQL需要的地方定义名字…… MySQL也和*一起工作。

 INSERT INTO names (name) SELECT name FROM ( SELECT name FROM ( SELECT 'Test 4' as name ) AS tmp_single WHERE NOT EXISTS ( SELECT name FROM names WHERE name = 'Test 4' ) UNION ALL SELECT name FROM ( SELECT 'Test 5' as name ) AS tmp_single WHERE NOT EXISTS ( SELECT name FROM names WHERE name = 'Test 5' ) ) tmp_all; 

MySQL:CREATE TABLE namesOID int(11)NOT NULL AUTO_INCREMENT, name varchar(32)COLLATE utf8_unicode_ci NOT NULL,PRIMARY KEY( OID ),UNIQUE KEY name_UNIQUEname ))ENGINE = InnoDB AUTO_INCREMENT = 1;

要么

MSSQL:CREATE TABLE [names]([OID] INT IDENTITY(1,1)NOT NULL,[name] NVARCHAR(32)NOT NULL,PRIMARY KEY CLUSTERED([OID] ASC)); CREATE UNIQUE NONCLUSTERED INDEX [Index_Names_Name] ON [names]([name] ASC);

在Microsoft SQL Server中,我可以使用IF语句:

 if not exists (select * from table where name = ...) insert into table...