我正在尝试执行以下查询:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
但这会返回错误。基本上,如果该记录的“名称”字段已经存在于另一条记录中,我不想插入一条记录-如何检查新名称是否唯一?
我正在尝试执行以下查询:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
但这会返回错误。基本上,如果该记录的“名称”字段已经存在于另一条记录中,我不想插入一条记录-如何检查新名称是否唯一?
Answers:
我实际上并不建议您这样做,因为UNIQUE
Piskvor和其他人建议的索引是一种更好的方法,但是您实际上可以做您想做的事情:
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;
插入一条记录:
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 |
+----+--------+-----------+------+
尝试再次插入相同的记录:
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 |
+----+--------+-----------+------+
插入其他记录:
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 |
+----+--------+-----------+------+
等等...
更新:
为了防止#1060 - Duplicate column name
在两个值相等的情况下出错,您必须命名内部SELECT的列:
INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Unknown' AS name, 'Unknown' AS address, '022' AS tele) 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 |
| 2 | John | Doe | 022 |
| 3 | Unknown | Unknown | 022 |
+----+---------+-----------+------+
name
在这种情况下)中引用的列。另请注意,您可以执行SELECT 'John', 'Doe', '022' FROM table_listnames
,而不是SELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
-,但这仅在table_listnames
已经包含一个或多个行时才有效。我怀疑速度是否会有所不同,因此可能不必担心。
WHERE
语句属于SELECT
查询。Select查询返回单个数据行(已插入数据)或根本没有数据(未插入任何数据)
SELECT 'Humbert', 'Humbert', '1'
,内部选择中),这似乎不起作用。我收到ERROR 1060 (42S21): Duplicate column name
#1060 - Duplicate column name
。您找到解决方案了吗?编辑:找到了。在每个值后面加上一个AS:SELECT * FROM (SELECT 'Rupert' as name, 'Rupert' as friend, '022' as number) AS tmp
您可以执行的操作:UNIQUE INDEX
在字段中创建一个唯一的(name
),然后使用以下任一方法:
INSERT
(如果名称已经存在,则处理错误)INSERT IGNORE
(如果名称已经存在,它将以INSERT ... ON DUPLICATE KEY UPDATE
(UPDATE
如果名称已经存在,它将在末尾执行,请参阅文档)mysql> show warnings\G
INSERT IGNORE
)与^Duplicate entry '.+' for key '.+'$
INSERT IGNORE
IMO 的大问题。
工作时间:
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提供了一个非常可爱的解决方案:
REPLACE INTO `table` VALUES (5, 'John', 'Doe', SHA1('password'));
因为您已经声明了唯一的主键(此处值为5),所以非常易于使用。
INSERT IGNORE INTO `mytable`
SET `field0` = '2',
`field1` = 12345,
`field2` = 12678;
此处是mysql查询,如果不存在则插入记录,并且将忽略现有的类似记录。
----Untested----
INSERT IGNORE INTO `mytable` (`field0`, `field1`, `field2`) values ('2', 12345, 12678);
吗
INSERT [...] IGNORE INTO mytable VALUES ...
或者INSERT [...] IGNORE INTO mytable SET col_name={expr | DEFAULT},...
您可以轻松使用以下方式:
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
这样,您可以插入任何新的原始数据,如果有重复的数据,请替换特定的列(最好的列是timestamps)。
例如 :
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';
为了克服类似的问题,我将表修改为具有唯一列。使用您的示例,在创建时,我将得到以下内容:
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 ;
注意:在尝试使用第一个查询之前,请使用第二个查询创建表。
布莱恩·胡珀(Brian Hooper):您几乎达到了要点,但是您的synatx出现了错误。您的插入内容将永远无法使用。我在数据库上进行了测试,这是正确的答案:
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'
我给你我的y表的例子。插入几乎与Bian Hooper所写的相同,只是我将其他表中的select FROM DUAL ont放在了其中。亲切的问候,伊万
我遇到了问题,而Mike建议的方法部分起作用,我出现了错误Dublicate Column name ='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抛出了重复的列名,我以这种语法编写了代码,并且效果很好,
我有一个类似的问题,如果不存在,我需要插入多个。因此,从上面的示例中,我得出了这种组合...只是为了防止有人需要它。
注意:我必须在任何地方定义名称,因为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 names
(
OID
int(11)NOT NULL AUTO_INCREMENT,
name
varchar(32)COLLATE utf8_unicode_ci NOT NULL,PRIMARY KEY(OID
),UNIQUE KEY name_UNIQUE
(name
))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)); 在[名称]([名称] ASC)上创建唯一的非索引索引[Index_Names_Name];
该查询可以在PHP代码中使用。
我在此表中有一个ID列,因此我需要检查除此ID列以外的所有列的重复项:
#need to change values
SET @goodsType = 1, @sybType=5, @deviceId = asdf12345SDFasdf2345;
INSERT INTO `devices` (`goodsTypeId`, `goodsId`, `deviceId`) #need to change tablename and columnsnames
SELECT * FROM (SELECT @goodsType, @sybType, @deviceId) AS tmp
WHERE NOT EXISTS (
SELECT 'goodsTypeId' FROM `devices` #need to change tablename and columns names
WHERE `goodsTypeId` = @goodsType
AND `goodsId` = @sybType
AND `deviceId` = @deviceId
) LIMIT 1;
现在仅在不存在以SET
字符串配置值的行的情况下才添加新项