J'utilise une table Oracle et j'ai créé une contrainte unique sur quatre colonnes. Ces colonnes dans la contrainte peuvent-elles avoir la valeur NULL?Contrainte unique sur plusieurs colonnes
Répondre
Vous pouvez avoir des valeurs NULL dans vos colonnes sauf si les colonnes sont spécifiées NOT NULL. Vous serez en mesure de stocker une seule instance de NULLs cependant (pas deux séries de mêmes colonnes seront autorisés à moins que toutes les colonnes sont NULL):
SQL> CREATE TABLE t (id1 NUMBER, id2 NUMBER);
Table created
SQL> ALTER TABLE t ADD CONSTRAINT u_t UNIQUE (id1, id2);
Table altered
SQL> INSERT INTO t VALUES (1, NULL);
1 row inserted
SQL> INSERT INTO t VALUES (1, NULL);
INSERT INTO t VALUES (1, NULL)
ORA-00001: unique constraint (VNZ.U_T) violated
SQL> /* you can insert two sets of NULL, NULL however */
SQL> INSERT INTO t VALUES (NULL, NULL);
1 row inserted
SQL> INSERT INTO t VALUES (NULL, NULL);
1 row inserted
Deux sont considérés comme nuls pas égaux dans Oracle, de sorte que ces colonnes peuvent avoir des valeurs nulles en eux.
Oui, Oracle permet UNIQUE de contenir des colonnes avec des contenus NULL, mais les contraintes de clé primaire ne peut contenir des colonnes contenant des valeurs NULL. (Edited: était "... nullable columns ...", mais mon exemple ci-dessous montre que cela n'est pas vrai.) Les colonnes d'un PK peuvent être définies comme nulles, mais ne peuvent pas contenir de NULL.)
Vous ne pouvez pas avoir de Contrainte UNIQUE et contrainte PRIMARY KEY avec les mêmes colonnes.
SQL> create table stest (col1 integer not null, col2 integer null);
Table created.
SQL> alter table stest add constraint stest_uq unique (col1, col2);
Table altered.
SQL> insert into stest values (1, 3);
1 row created.
SQL> insert into stest values (1, null);
1 row created.
SQL> insert into stest values (1, null);
insert into stest values (1, null)
*
ERROR at line 1:
ORA-00001: unique constraint (SUSAN_INT.STEST_UQ) violated
SQL> insert into stest values (2, null);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from stest;
COL1 COL2
---------- ----------
1 3
1
2
SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2);
alter table stest add constraint stest_pk PRIMARY KEY (col1, col2)
*
ERROR at line 1:
ORA-01449: column contains NULL values; cannot alter to NOT NULL
SQL> truncate table stest;
Table truncated.
SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2);
alter table stest add constraint stest_pk PRIMARY KEY (col1, col2)
*
ERROR at line 1:
ORA-02261: such unique or primary key already exists in the table
SQL> alter table stest drop constraint stest_uq;
Table altered.
SQL> alter table stest add constraint stest_pk PRIMARY KEY (col1, col2);
Table altered.
- 1. Ajouter une contrainte unique sur plusieurs colonnes avec FluentNHibernate
- 2. Contrainte de table SQLite - unique sur plusieurs colonnes
- 3. Contrainte unique sur plus de 10 colonnes
- 4. sur plusieurs VERIFIER CONTRAINTE colonnes
- 5. MySQL: Contrainte unique sur plusieurs champs
- 6. Comment créer une contrainte SQL unique basée sur 2 colonnes?
- 7. contrainte unique conditionnelle
- 8. Contrainte unique Nhibernate
- 9. Contrainte UNIQUE dans SQLite
- 10. unique par plusieurs colonnes et valeurs NULL
- 11. Contrainte - unique ou vide
- 12. Contrainte unique dans MySQL
- 13. sql contrainte unique
- 14. Contrainte unique avec condition MYSQL
- 15. Rails Modèle à plusieurs colonnes unique
- 16. Syntaxe DTD pour la contrainte SQL UNIQUE
- 17. Configuration de la contrainte unique sur les colonnes référencées dans Oracle 10g xe
- 18. Contrainte unique avec colonne nullable
- 19. sql - Comment appliquer une contrainte sur deux colonnes?
- 20. nombre unique de colonnes?
- 21. DDD - Validation de contrainte unique
- 22. Contrainte unique non créée dans JPA
- 23. SQL Server contrainte unique (mais parfois)
- 24. contrainte unique (w/o Trigger) sur la relation
- 25. Postgresql duplicate clé viole contrainte unique
- 26. SQL - Comment appliquer une contrainte "semi-unique"?
- 27. Sql: Contrainte de champ unique (slug) sur plusieurs tables (doctrine/symfony)
- 28. contrainte unique sur un grand champ de texte
- 29. T-SQL Contrainte unique verrouillée sur le serveur SQL
- 30. Ajout d'une contrainte unique sur la valeur calculée d'une colonne
Il me semble qu'il est assez trivial de trouver la réponse à ceci avec un test. Cela peut-il prendre plus d'une minute pour le faire? –
Oui - vous avez raison. Mais j'ai appris d'autres informations à partir des réponses que Vincent, Amber et Shoover ont publiées. – Nicks