我正在尝试执行以下查询:
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'
);
但是这会返回一个错误。基本上我不想插入一个记录,如果记录的“名称”字段已经存在于另一个记录-如何检查新名称是否唯一?
当前回答
我遇到了一个问题,迈克建议的方法部分有效,我有一个错误复制列名= '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抛出重复的列名,我用这种语法写了代码,它工作得很好,
其他回答
你可以简单地使用以下方法:
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)。
我有一个类似的问题,我需要插入多个如果不存在。所以从上面的例子中,我得出了这个组合……放在这里,以防有人需要。
注意: 我必须在MSSQL要求的地方定义name…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: 创建表名( OID int(11) NOT NULL AUTO_INCREMENT name varchar(32) COLLATE utf8_unicode_ci NOT NULL 主键oid, 唯一键名称 InnoDB AUTO_INCREMENT=1;
or
该软件: 创建表[names] ( [oid] int identity (1,1) not null, [name] NVARCHAR (32) NOT NULL, 主键集群化([oid] asc) ); 创建唯一的非聚集索引[Index_Names_Name] ON [names]([name] ASC);
这个查询可以在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字符串中配置的值不存在的情况下才会添加新项
为了克服类似的问题,我修改了表,使其具有唯一的列。用你的例子,在创建时,我会有这样的东西:
name VARCHAR(20),
UNIQUE (name)
然后在插入时使用以下查询:
INSERT IGNORE INTO train
set table_listnames='Rupert'