web-dev-qa-db-fra.com

SQL Server, impossible d'insérer null dans le champ de clé primaire?

Je suis sur le point de m'arracher les cheveux. Je suis assez nouveau sur MS SQL et je n'ai encore jamais vu de message similaire.

Quand j'essaie de faire une déclaration comme celle-ci:

INSERT INTO qcRawMatTestCharacteristic 
VALUES(NULL, 1,1,1,1,1,1,1,'','','', GETDATE(), 1)

Je reçois ce qui suit:

Impossible d'insérer la valeur NULL dans colonne 'iRawMatTestCharacteristicId', table 'Intranet.dbo.qcRawMatTestCharacteristic'; colonne n'autorise pas les valeurs NULL. INSÉRER échoue.

Je comprends l'erreur, mais la valeur null concerne mon champ principal avec un type de données int.

Des idées!?

17
Nick

Les clés primaires de la base de données relationnelle any ne sont pas autorisées à être NULL - c'est l'une des principales caractéristiques fondamentales d'une clé primaire.

Voir: SQL by Design: comment choisir la clé primaire

Jamais Nul
Aucune valeur de clé primaire ne peut être nulle et vous ne pouvez rien faire pour rendre la clé primaire nulle. C'est une règle inviolable du relationnel modèle pris en charge par ANSI, of Système de gestion de base de données relationnelle (SGBDR), et de SQL Server.

UPDATE: ok, vous voulez donc une clé primaire "à incrémentation automatique" dans SQL Server.

Vous devez le définir comme ID INT dans votre instruction CREATE TABLE:

 CREATE TABLE dbo.YourTable(ID INT IDENTITY, col1 INT, ..., colN INT)

et ensuite, lorsque vous effectuez un INSERT, vous devez spécifier explicitement les colonnes à insérer, mais ne spécifiez pas simplement la colonne "ID" dans cette liste - SQL Server se chargera alors de rechercher la valeur appropriée automatiquement:

 INSERT INTO dbo.YourTable(col1, col2, ..., colN) -- anything **except** `ID`      
 VALUES(va1l, val2, ..., valN)

Si vous souhaitez le faire après avoir déjà créé la table, vous pouvez le faire dans le concepteur de table de SQL Server Management Studio:

alt text

48
marc_s

Les champs de clé primaire ne peuvent pas contenir de valeurs NULL dans MS SQL. Si vous souhaitez renseigner une table SQL et ne savez pas quoi entrer pour un champ de clé primaire basé sur un nombre entier, définissez pk sur un champ Identity. De même, lorsque vous spécifiez des instructions Insert, il est judicieux d'utiliser la partie de mappage de colonne de la déclaration d'insertion, par exemple:

Insert into (field1, field2, field3)
values
(value1, value2, value3)

La raison en est que cela garantit que l'ordre des colonnes correspond à ce que vous avez développé en tant qu'administrateur SQL peut modifier l'ordre des colonnes. Il vous permet également d’insérer une ligne avec une clé primaire d’identité sans spécifier la valeur de la clé primaire. Exemple

CREATE TABLE [dbo].[foo](
    [fooid] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](50) NULL,
 CONSTRAINT [PK_foo] PRIMARY KEY
(
        [fooid] ASC
)

maintenant ma déclaration d'insertion est simple

Insert into foo (name)
values
("John")

le résultat dans la table serait 

1, "John"
8
John Hartsock

Vous n'avez probablement pas (vous avez oublié d'ajouter) autoincrement défini sur votre clé primaire entière.

4
Alin Purcaru

Les clés primaires ne doivent pas accepter la valeur null.Pourquoi vous insérez des valeurs null dans un champ de clé primaire? Le champ de clé primaire doit avoir une valeur unique non nullable qui rendra chaque enregistrement de la table unique

3
Shyju

vous pouvez utiliser 0 au lieu de null pour une seule ligne, null n'est pas possible pour PK. Ou vous pouvez omettre PK et utiliser et incrémenter automatiquement le champ PK

2
sirmak

En supposant que vous ayez un champ d'auto-incrémentation pour votre clé primaire, vous devrez inclure la liste de champs sur votre insertion et ne pas mettre de valeur pour ce champ, par exemple.

INSERT INTO qcRawMatTestCharacteristic 
(Answer1,Answer2,...SomeDateField)
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1)
2
Conrad Frix

Je suppose que votre vrai problème est que vous ne savez pas comment écrire une instruction insert pour que la PK soit automatiquement renseignée? Vous devez nommer les champs pour lesquels vous définissez des valeurs. On dirait que vous essayez de les définir tous mais que vous excluez simplement le champ PK comme suit:

INSERT INTO someTable
(fieldName1, fieldName2) 
VALUES(1,1)

Où quelque chose est une table avec trois champs. PK, fieldName1 et fieldName2. Vous devez également vous assurer que la propriété d'identité du champ PK est définie sur true.

2
Spencer Ruport

si vous avez une colonne d'identité, vous n'avez pas besoin de la spécifier dans l'instruction insert. 

INSERT INTO qcRawMatTestCharacteristic  
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1) 

Toutefois, si votre clé primaire n’est pas une colonne d’identité, vous devez la spécifier, sinon elle essaiera d’insérer une valeur null et les clés primaires par défaut ne sont pas nullables.

0
DForck42