在MY-SQL中将多个值一起插入,这些值不存在。其中“NULL”应该是唯一的

问题描述 投票:0回答:2

我有桌子结构。

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) ) 
mysql bulkinsert
2个回答
1
投票

只是为了澄清问题

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)

0
投票

这似乎是预期的MySQL行为。

请参阅Bug#8173:唯一索引允许带有空值的重复项(https://bugs.mysql.com/bug.php?id=8173),该值已标记为非错误。

© www.soinside.com 2019 - 2024. All rights reserved.