我有桌子结构。
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')
一起插入,那么它应该只插入第二个值。
我尝试使用insert ignore(MYSQL功能),我为所有列创建唯一ID。
但是如果值为null则存在问题,那么unique不起作用。我的数据可以包含空值。但这也应该是独一无二的。
我知道这是预期的行为。但是我怎样才能获得所需的功能?
如果两行有相同的数据,我的自动增量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) )
只是为了澄清问题
MariaDB [sandbox]> CREATE TABLE test_duplicate_join
-> (
-> vendor INT,
-> buyside INT,
-> columnnme VARCHAR(32),
-> mappingid INT ,
-> columntype VARCHAR(32)
-> );
Query OK, 0 rows affected (0.20 sec)
MariaDB [sandbox]> ALTER TABLE test_duplicate_join ADD PRIMARY KEY(mappingId);
Query OK, 0 rows affected (0.37 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [sandbox]> ALTER TABLE test_duplicate_join
-> MODIFY mappingId INT NOT NULL AUTO_INCREMENT;
Query OK, 0 rows affected (0.47 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [sandbox]> CREATE UNIQUE INDEX idx_name_phone ON test_duplicate_join(vendor,buyside,columnnme,columntype);
Query OK, 0 rows affected (0.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO test_duplicate_join (vendor,buyside,columntype)
-> VALUES (0,34,'Excel'),(0,35,'A');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO test_duplicate_join (vendor,buyside,columntype)
-> VALUES (0,34,'Excel'),(0,36,'fd');
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [sandbox]>
MariaDB [sandbox]> select * from test_duplicate_join;
+--------+---------+-----------+-----------+------------+
| vendor | buyside | columnnme | mappingId | columntype |
+--------+---------+-----------+-----------+------------+
| 0 | 34 | NULL | 1 | Excel |
| 0 | 34 | NULL | 3 | Excel |
| 0 | 35 | NULL | 2 | A |
| 0 | 36 | NULL | 4 | fd |
+--------+---------+-----------+-----------+------------+
4 rows in set (0.00 sec)
这似乎是预期的MySQL行为。
请参阅Bug#8173:唯一索引允许带有空值的重复项(https://bugs.mysql.com/bug.php?id=8173),该值已标记为非错误。