Вставьте несколько значений вместе в MY-SQL, которые не существуют.где «NULL» должен быть уникальным - PullRequest
0 голосов
/ 23 мая 2018

У меня есть структура таблицы.

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 .

Я попытался с помощью игнорирования вставки (функция MYSQL), где я делаю уникальный идентификатор для всех столбцов.

Но есть проблема, если значения имеют нулевое значение, тогда уникальное не работает.Мои данные могут иметь нулевые значения.Но это также должно быть уникальным.

Я знаю, что это ожидаемое поведение.Но как я могу получить требуемую функциональность?

Если две строки содержат одинаковые данные, кроме моего идентификатора автоинкремента, то это дубликат.

Обновление 1 :: Для одиночной вставки мы можем сделать это такесли только columnnme может быть пустым.Для других столбцов мы можем поставить 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) ) 

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Просто чтобы прояснить проблему

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 голосов
/ 23 мая 2018

Похоже, ожидается Поведение MySQL.

См. Ошибка # 8173: уникальный индекс позволяет дублировать с нулевыми значениями (https://bugs.mysql.com/bug.php?id=8173), который имеетотмечен как Не ошибка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...