web-dev-qa-db-de.com

SQL Server, kann nicht Null in Primärschlüsselfeld einfügen?

Ich bin kurz davor, mir die Haare auszureißen. Ich bin relativ neu in MS SQL und habe nirgendwo einen ähnlichen Beitrag gesehen.

Wenn ich versuche, eine Aussage wie folgt zu machen:

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

Ich bekomme folgendes:

Der Wert NULL kann nicht in .__ eingefügt werden. Spalte 'iRawMatTestCharacteristicId', Tabelle "Intranet.dbo.qcRawMatTestCharacteristic"; Spalte erlaubt keine Nullen. EINFÜGEN schlägt fehl.

Ich verstehe den Fehler, aber der Nullwert ist für mein Primärfeld mit einem Int-Datentyp.

Irgendwelche Ideen!?

17
Nick

Primärschlüssel in der relationalen Datenbank any dürfen nicht NULL sein. Dies ist eines der wichtigsten Merkmale eines Primärschlüssels.

Siehe: SQL by Design: So wählen Sie den Primärschlüssel aus

Nie Null
Kein Primärschlüsselwert kann Null sein, und Sie können nichts an Nimm den Primärschlüssel. Das ist eine unverletzliche Regel des Verhältnisses Modell wie von ANSI unterstützt, von Relationales Datenbank Management System (RDBMS) -Design und von SQL Server.

UPDATE: OK, Sie möchten also einen Primärschlüssel "Auto-Inkrement" in SQL Server.

Sie müssen es in Ihrer CREATE TABLE-Anweisung als INT IDENTITY definieren:

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

wenn Sie dann eine INSERT-Anweisung ausführen, müssen Sie die einzufügenden Spalten explizit angeben. Geben Sie jedoch nicht die Spalte "ID" in dieser Liste an. Dann sucht SQL Server automatisch nach dem richtigen Wert:

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

Wenn Sie dies tun möchten, nachdem Sie die Tabelle bereits erstellt haben, können Sie dies im Tabellen-Designer von SQL Server Management Studio tun:

alt text

48
marc_s

Primärschlüsselfelder dürfen in MS SQL keine Nullwerte enthalten. Wenn Sie eine SQL-Tabelle auffüllen möchten und nicht wissen, was Sie für ein Ganzzahl-basiertes Primärschlüsselfeld eingeben müssen, setzen Sie das PK auf ein Identitätsfeld. Bei der Angabe von Insert-Anweisungen sollten Sie beispielsweise den Spaltenzuordnungsteil der Insert-Anweisung verwenden:

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

Der Grund dafür ist, dass sichergestellt wird, dass die Spaltenreihenfolge die ist, für die Sie entwickelt haben, da ein SQL-Administrator die Spaltenreihenfolge ändern kann. Außerdem können Sie eine Zeile mit einem Identitäts-Primärschlüssel einfügen, ohne den Wert des Primärschlüssel-Beispiels anzugeben

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

jetzt ist meine Einfügeanweisung einfach

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

das Ergebnis in der Tabelle wäre 

1, "John"
8
John Hartsock

Sie haben wahrscheinlich keinen Autoincrement-Satz für Ihren Ganzzahl-Primärschlüssel (Sie haben das Hinzufügen vergessen).

4
Alin Purcaru

Primärschlüssel sollten keinen Nullwert akzeptieren. Warum fügen Sie Nullwerte in ein Primärschlüsselfeld ein? Primärschlüsselfeld sollte einen nicht-nullwertfähigen, eindeutigen Wert haben, der jeden Datensatz in der Tabelle eindeutig macht

3
Shyju

sie können 0 anstelle von Null nur für eine eindeutige Zeile verwenden. Für PK ist Null nicht möglich. Oder Sie können das PK-Feld weglassen und das PK-Feld für die automatische Erhöhung verwenden

2
sirmak

Vorausgesetzt, Sie haben ein Autoincrement-Feld für Ihren Primärschlüssel, müssen Sie die Feldliste in Ihre Einfügung aufnehmen und keinen Wert für dieses Feld angeben, z.

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

Ich gehe davon aus, dass Sie sich nicht sicher sind, wie Sie eine Einfügeanweisung schreiben, damit die PK automatisch korrekt ausgefüllt wird. Sie müssen die Felder benennen, für die Sie Werte festlegen. Es sieht so aus, als würden Sie versuchen, alle Felder festzulegen, aber schließen Sie das PK-Feld wie folgt aus:

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

Wo ist eine Tabelle mit drei Feldern? PK, Feldname1 und Feldname2. Sie müssen auch sicherstellen, dass die Identitätseigenschaft im Feld PK auf true festgelegt ist.

2
Spencer Ruport

wenn Sie über eine Identitätsspalte verfügen, müssen Sie diese nicht in der Einfügeanweisung angeben. 

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

Wenn Sie jedoch einen Primärschlüssel haben, der keine Identitätsspalte ist, müssen Sie ihn angeben, da andernfalls versucht wird, einen Nullwert einzufügen, und der Primärschlüssel ist standardmäßig nicht zulässig.

0
DForck42