Arjuna Aircraft Ident.: F-MBSD |
Les contraintes d'intégrité, ça se résume pas aux FK.
Voilà ce qu'est une contrainte d'intégrité :
Citation :
CONSTRAINT
Mot clé facultatif indiquant le début d'une définition de contrainte PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY ou CHECK. Les contraintes sont des propriétés spéciales qui assurent l'intégrité des données et qui peuvent créer des index pour une table et ses colonnes.
constraint_name
Nom de la contrainte. Les noms de contraintes doivent être uniques dans une base de données.
NULL | NOT NULL
Mots clés déterminant si les valeurs NULL sont permises dans une colonne. NULL n'est pas strictement une contrainte mais elle peut être spécifiée de la même manière que NOT NULL.
PRIMARY KEY
Contrainte assurant l'intégrité de l'entité d'une colonne ou de plusieurs colonnes données au moyen d'un seul index. Une seule contrainte PRIMARY KEY peut être créée par table.
UNIQUE
Contrainte assurant l'intégrité de l'entité d'une colonne ou de plusieurs colonnes données au moyen d'un seul index. Une table peut comprendre plusieurs contraintes UNIQUE.
CLUSTERED | NONCLUSTERED
Mots clés indiquant la création d'un index ordonné ou non en clusters pour la contrainte PRIMARY KEY ou UNIQUE. Les contraintes PRIMARY KEY sont par défaut CLUSTERED et les contraintes UNIQUE sont NONCLUSTERED.
Vous ne pouvez spécifier CLUSTERED que pour une seule contrainte dans une instruction CREATE TABLE. Si vous spécifiez CLUSTERED pour une contrainte UNIQUE et que vous spécifiez également une contrainte PRIMARY KEY, la contrainte PRIMARY KEY est par défaut NONCLUSTERED.
[WITH FILLFACTOR = fillfactor]
Spécifie le remplissage par SQL Server des pages d'index utilisées pour stocker les données d'index. Les valeurs fillfactor définies par l'utilisateur peuvent être comprises entre 1 et 100, la valeur par défaut étant 0. Un facteur de remplissage peu élevé crée l'index en laissant plus d'espace disponible pour les nouvelles entrées d'index sans avoir à allouer de nouvel espace.
FOREIGN KEY...REFERENCES
Contrainte qui assure l'intégrité référentielle des données des colonnes. Avec les contraintes FOREIGN KEY, il faut que chaque valeur de la colonne existe dans la ou les colonne(s) référencée(s) correspondante(s) de la table référencée. Les contraintes FOREIGN KEY ne peuvent faire référence qu'à des colonnes qui sont des contraintes PRIMARY KEY ou UNIQUE dans la table référencée ou des colonnes référencées dans un UNIQUE INDEX sur la table référencée.
ref_table
Nom de la table référencée par la contrainte FOREIGN KEY.
(ref_column[,...n])
Colonne, ou liste de colonnes, provenant de la table référencée par la contrainte FOREIGN KEY.
ON DELETE {CASCADE | NO ACTION}
Indique l'action entreprise pour une ligne dans la table créée, si cette ligne détient une relation référentielle et que la ligne référencée est supprimée de la table parent. La valeur par défaut est NO ACTION. Si la valeur CASCADE est spécifiée, une ligne est supprimée de la table de référence si elle est supprimée de la table parent. Si la valeur NO ACTION est spécifiée, SQL Server déclenche une erreur et la suppression de la ligne dans la table parent est annulée.
Par exemple, dans la base de données Northwind, la table Orders possède une relation référentielle avec la table Customers. La clé étrangère Orders.CustomerID fait référence à la clé primaire Customers.CustomerID.
Si une instruction DELETE est exécutée sur une ligne dans la table Customers, et qu'une action ON DELETE CASCADE est spécifiée pour Orders.CustomerID, SQL Server vérifie la présence d'une ou plusieurs lignes dépendantes dans la table Orders. Les lignes dépendantes éventuellement détectées dans la table Orders sont supprimées, ainsi que la ligne référencée dans la table Customers.
Par contre, si la valeur NO ACTION est spécifiée, SQL Server déclenche une erreur et annule la suppression de la ligne dans la table Customers si au moins une ligne y fait référence dans la table Orders.
ON UPDATE {CASCADE | NO ACTION}
Indique l'action entreprise pour une ligne dans la table créée, si cette ligne détient une relation référentielle et que la ligne référencée est mise à jour dans la table parent. La valeur par défaut est NO ACTION. Si la valeur CASCADE est spécifiée, la ligne est mise à jour dans la table de référence si elle est mise à jour dans table parent. Si la valeur NO ACTION est spécifiée, SQL Server déclenche une erreur et la mise à jour de la ligne dans la table parent est annulée.
Par exemple, dans la base de données Northwind, la table Orders possède une relation référentielle avec la table Customers : la clé étrangère Orders.CustomerID fait référence à la clé primaire Customers.CustomerID.
Si une instruction UPDATE est exécutée sur une ligne dans la table Customers, et qu'une action ON UPDATE CASCADE est spécifiée pour Orders.CustomerID, SQL Server vérifie la présence d'une ou plusieurs lignes dépendantes dans la table Orders. Les lignes dépendantes éventuellement détectées dans la table Orders sont mises à jour, ainsi que la ligne référencée dans la table Customers.
Par contre, si la valeur NO ACTION est spécifiée, SQL Server déclenche une erreur et annule la mise à jour de la ligne dans la table Customers si au moins une ligne y fait référence dans la table Orders.
CHECK
Contrainte qui assure l'intégrité du domaine en limitant les valeurs possibles pouvant être entrées dans une ou plusieurs colonnes.
NOT FOR REPLICATION
Mots clés utilisés pour éviter que la contrainte CHECK soit appliquée pendant le processus de distribution utilisé par la réplication. Lorsque les tables sont des abonnés à une publication de réplication, ne mettez pas à jour directement la table d'abonnement mais mettez plutôt à jour la table de publication et laissez la réplication redistribuer les données à la table d'abonnement. Une contrainte CHECK peut être définie dans la table d'abonnement afin d'éviter que les utilisateurs la modifie. Sauf si vous ajoutez la clause NOT FOR REPLICATION, la contrainte CHECK empêche également le processus de réplication de distribuer les modifications de la table de publication vers la table d'abonnement. La clause NOT FOR REPLICATION signifie que la contrainte est appliquée pour les modifications des utilisateurs mais pas pour le processus de réplication.
La contrainte NOT FOR REPLICATION CHECK s'applique à la fois à l'image précédant et suivant la mise à jour de l'enregistrement, afin d'éviter que des enregistrements soient ajoutés ou supprimés de la plage répliquée. Toutes les insertions et suppressions sont contrôlées ; si elles font partie de la plage répliquée, elles sont rejetées.
Lorsque vous utilisez cette contrainte avec une colonne d'identité, SQL Server permet que les valeurs de la colonne d'identité de la table ne soient pas réinitialisées lorsqu'un utilisateur de la réplication met à jour la colonne d'identité.
logical_expression
Expression logique qui renvoie TRUE ou FALSE.
column
Colonne, ou liste de colonnes, entre parenthèses utilisée dans des contraintes de table pour indiquer les colonnes utilisées dans la définition de la contrainte.
[ASC | DESC]
Indique l'ordre de tri de la ou des colonnes impliquées dans les contraintes de table. La valeur par défaut est ASC.
n
Emplacement réservé qui indique que l'élément précédent peut se répéter n fois.
|
En gros, une contrainte d'intégrité, outre les contraintes classiques "PRIMARY, UNIQUE et FOREIGN KEY", y'a aussi et surtout les contraintes CHECK, qui permettent d'énumérer les valeurs possibles, ou vérifier que la données saisie est cohérente.
Genre, dans une table "commande", tu mettras une contrainte avec > 0 sur le montant quand c'est une commande, et < 0 quand il s'agit d'un avoir.
Exemples issus de la doc :
Code :
- /* ************************** jobs table ************************** */
- CREATE TABLE jobs
- (
- job_id smallint
- IDENTITY(1,1)
- PRIMARY KEY CLUSTERED,
- job_desc varchar(50) NOT NULL
- DEFAULT 'New Position - title not formalized yet',
- min_lvl tinyint NOT NULL
- CHECK (min_lvl >= 10),
- max_lvl tinyint NOT NULL
- CHECK (max_lvl <= 250)
- )
- /* ************************* employee table ************************* */
- CREATE TABLE employee
- (
- emp_id empid
- CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED
- CONSTRAINT CK_emp_id CHECK (emp_id LIKE
- '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or
- emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),
- /* Each employee ID consists of three characters that
- represent the employee's initials, followed by a five
- digit number ranging from 10000 through 99999 and then the
- employee's gender (M or F). A (hyphen) - is acceptable
- for the middle initial. */
- fname varchar(20) NOT NULL,
- minit char(1) NULL,
- lname varchar(30) NOT NULL,
- job_id smallint NOT NULL
- DEFAULT 1
- /* Entry job_id for new hires. */
- REFERENCES jobs(job_id),
- job_lvl tinyint
- DEFAULT 10,
- /* Entry job_lvl for new hires. */
- pub_id char(4) NOT NULL
- DEFAULT ('9952')
- REFERENCES publishers(pub_id),
- /* By default, the Parent Company Publisher is the company
- to whom each employee reports. */
- hire_date datetime NOT NULL
- DEFAULT (getdate())
- /* By default, the current system date is entered. */
- )
- /* ***************** publishers table ******************** */
- CREATE TABLE publishers
- (
- pub_id char(4) NOT NULL
- CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED
- CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')
- OR pub_id LIKE '99[0-9][0-9]'),
- pub_name varchar(40) NULL,
- city varchar(20) NULL,
- state char(2) NULL,
- country varchar(30) NULL
- DEFAULT('USA')
- )
|
Et après ça, tu te dis DBA ? Là moi je suis mort de rire.
Au fait, tu dis que je suis un DBA incompétent depuis plusieurs posts, mais :
Primo, niveau DBA nul, t'as l'air de te poser là.
Deuxio, j'ai jamais dit que j'étais DBA... et je ne le suis pas. |