MySQL уникальное составное ограничение не работает - PullRequest
1 голос
/ 07 августа 2011

Я создал уникальный индекс, подобный этому:

ALTER TABLE items 
ADD UNIQUE INDEX uni_item 
(warehouse_id, width, height, depth, weight);

но я все еще могу добавлять дубликаты, почему это не работает?

Примечание:

В самой таблице также есть некоторые столбцы, которые здесь не включены, а warehouse_id - это внешний ключ, но эти вещи не должны иметь значения, верно?

Спасибо!

@ cularis: вот пример успешно добавленных дубликатов:

item_id, warehouse_id, width, height, depth, weight, date
1              4        100    100     100     14     2011-08-07 07:01:26


item_id, warehouse_id, width, height, depth, weight, date
6              4        100    100     100     14     2011-08-07 07:01:32

EDIT:

Добавление дополнительной информации по мере необходимости:

CREATE TABLE `items` (
 `item_id` int(11) NOT NULL AUTO_INCREMENT,
 `warehouse_id` int(11) NOT NULL,
 `width` decimal(3,2) NOT NULL,
 `height` decimal(3,2) NOT NULL,
 `depth` decimal(3,2) NOT NULL,
 `weight` decimal(3,2) NOT NULL,
 `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `uni_item` (`warehouse_id`,`width`,`height`,`depth`,`weight`),
KEY `warehouse_id` (`warehouse_id`),
CONSTRAINT `items_ibfk_1` FOREIGN KEY (`warehouse_id`) REFERENCES `warehouses` (`warehouse_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci






 INSERT INTO `main`.`items` (
`item_id` ,
`warehouse_id` ,
`width` ,
`height` ,
`depth` ,
`weight` ,
`date`
)
VALUES (
NULL , '4', 100, 100, 100, 14, CURRENT_TIMESTAMP
)

Ответы [ 2 ]

1 голос
/ 07 августа 2011

Не воспроизводится на MySQL 5.1.58

CREATE TABLE `items` (
 `item_id` int(11) NOT NULL,
 `warehouse_id` int(11) NOT NULL,
 `width`  decimal(3,2) NOT NULL,
 `height`  decimal(3,2) NOT NULL,
 `depth`  decimal(3,2) NOT NULL,
 `weight`  decimal(3,2) NOT NULL,
 `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`item_id`),
 UNIQUE KEY `uni_item` (`warehouse_id`,`width`,`height`,`depth`,`weight`), 
 KEY `warehouse_id` (`warehouse_id`), 
 CONSTRAINT `items_ibfk_1` FOREIGN KEY (`warehouse_id`) 
    REFERENCES `warehouses` (`warehouse_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB;

CREATE TABLE `warehouses` (
 `warehouse_id` int(11) NOT NULL,
 `data` text,
 PRIMARY KEY (`warehouse_id`)
) ENGINE=InnoDB;

insert into warehouses values (4, 'test');
Query OK, 1 row affected (0.01 sec)

Результат:

mysql> insert into items values (1,4,100,100,100,14,'2011-08-07 07:01:26');
Query OK, 1 row affected (0.01 sec)
mysql> insert into items values (6,4,100,100,100,14,'2011-08-07 07:01:32');
ERROR 1062 (23000): Duplicate entry '4-9.99-9.99-9.99-9.99' for key 'uni_item'

РЕДАКТИРОВАТЬ : использовать определения таблиц, представленные в вопросе

0 голосов
/ 07 августа 2011

большое спасибо за помощь.

Кажется, что-то не так с моей установкой, я переустановил весь сервер, и ограничение работает просто отлично.

...