Bug #9844 | Unique Index constraint doesn't work | ||
---|---|---|---|
Submitted: | 12 Apr 2005 13:47 | Modified: | 15 Apr 2005 13:20 |
Reporter: | Sergi Vergés | Email Updates: | |
Status: | Not a Bug | Impact on me: | |
Category: | MySQL Server: InnoDB storage engine | Severity: | S2 (Serious) |
Version: | 5.0.3-beta-nt | OS: | Windows (Windows 2000 sp4) |
Assigned to: | CPU Architecture: | Any |
[12 Apr 2005 13:47]
Sergi Vergés
[12 Apr 2005 13:53]
Sergi Vergés
Anyway if I delete the created records, and try to alter the table to add another time de constraint ALTER TABLE TIPUS_ALCOHOL ADD CONSTRAINT TIPUS_ALCOHOL_UK UNIQUE ( MARCA, DATA_BAIXA ); the server launch the error of duplicate keys, when there are no records. Thanks
[12 Apr 2005 17:27]
MySQL Verification Team
mysql> show create table TIPUS\G *************************** 1. row *************************** Table: TIPUS Create Table: CREATE TABLE `tipus` ( `TIPUS_ID` int(11) NOT NULL auto_increment, `MARCA` varchar(100) default NULL, `PREU` float default NULL, `STOCK` int(11) default NULL, `DATA_BAIXA` datetime default NULL, PRIMARY KEY (`TIPUS_ID`), UNIQUE KEY `TIPUS_UK` (`MARCA`,`DATA_BAIXA`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.01 sec) mysql> insert into tipus(marca) values('m'); Query OK, 1 row affected (0.04 sec) mysql> insert into tipus(marca) values('m'); Query OK, 1 row affected (0.04 sec) mysql> select * from TIPUS; +----------+-------+------+-------+------------+ | TIPUS_ID | MARCA | PREU | STOCK | DATA_BAIXA | +----------+-------+------+-------+------------+ | 1 | m | NULL | NULL | NULL | | 2 | m | NULL | NULL | NULL | +----------+-------+------+-------+------------+ 2 rows in set (0.00 sec) Notice above that you didn't violate the unique constraint since one of the columns can hold NULL values. mysql> ALTER TABLE TIPUS -> ADD CONSTRAINT TIPUS_UK UNIQUE -> ( -> MARCA, -> DATA_BAIXA -> ) -> ; ERROR 1061 (42000): Duplicate key name 'TIPUS_UK' The above error is true TIPUS_UK already exists.
[12 Apr 2005 17:44]
Sergi Vergés
Sorry, I didn't notice what the error was saying.
[13 Apr 2005 11:05]
Sergi Vergés
I think that this behaviour is not correct at all, because the null value is a value too. This example was for save historical data, as dimension table in a datawarehouse. Marca is the name of an entity and Data_Baixa is the deletion_date. I couldn't have two records in the table with the same name and both active. Thanks for all.
[15 Apr 2005 13:20]
Marko Mäkelä
Sergi, In SQL, NULL=anything does not hold. Because of this, a multi-column unique index will accept duplicates if any of the columns is NULL. I believe that this is specified in the SQL standard.