我有桌面结构。
CREATE TABLE test_duplicate_join
(
vendor INT,
buyside INT,
columnnme VARCHAR(32),
mappingid INT ,
columntype VARCHAR(32)
);
ALTER TABLE test_duplicate_join ADD PRIMARY KEY(mappingId);
ALTER TABLE test_duplicate_join
MODIFY mappingId INT NOT NULL AUTO_INCREMENT;
CREATE UNIQUE INDEX idx_name_phone ON test_duplicate_join(vendor,buyside,columnnme,columntype);
INSERT INTO test_duplicate_join (vendor,buyside,columntype)
VALUES (0,34,'Excel'),(0,35,'A');
在此之后,如果我尝试将(0,34, 'Excel'),(1,36, 'fd')
插入到一起,那么它应该只插入 2nd 值。
我尝试使用insert ignore(MYSQL功能),我为所有列创建唯一ID。
但是如果值为null,则存在问题,那么唯一不起作用。 我的数据可以包含空值。但这也应该是独一无二的。
我知道这是预期的行为。但是,我如何才能获得所需的功能?
如果两行有相同的数据,我的自动增量ID,那么它是重复的。
更新1 ::
对于单个插入,我们可以这样做,如果" columnnme"只能是null。对于其他列,我们可以放置case
。如何将多个插入物组合在一起?
INSERT INTO test_duplicate_join (vendor,buyside,columnnme) SELECT 0,0,NULL
WHERE NOT EXISTS
( SELECT 1 FROM test_duplicate_join d WHERE
d.vendor = 0
AND
d.buyside = 0
AND
d.columnnme = (CASE WHEN ISNULL(NULL) THEN columnnme IS NULL ELSE
columnnme=NULL END) )
答案 0 :(得分:1)
只是澄清问题
-rw-rw---- 1 root root 1073742220 May 13 23:36 /var/lib/my-app/my-app.001219
-rw-rw---- 1 root root 1073742065 May 15 07:21 /var/lib/my-app/my-app.001220
-rw-rw---- 1 root root 1073742428 May 16 12:18 /var/lib/my-app/my-app.001221
-rw-rw---- 1 root root 1073741955 May 17 15:04 /var/lib/my-app/my-app.001222
-rw-rw---- 1 root root 1073742263 May 18 17:21 /var/lib/my-app/my-app.001223
-rw-rw---- 1 root root 1073742288 May 19 19:46 /var/lib/my-app/my-app.001224
-rw-rw---- 1 root root 1073741896 May 20 22:45 /var/lib/my-app/my-app.001225
-rw-rw---- 2 root root 1073742131 May 22 10:37 /var/lib/my-app/my-app.001226
-rw-rw---- 1 root root 967375006 May 23 13:37 /var/lib/my-app/my-app.001227
答案 1 :(得分:0)
这似乎是预期的 MySQL行为。
请参阅错误#8173:唯一索引允许带有空值的重复(https://bugs.mysql.com/bug.php?id=8173),该标记已标记为非错误。