Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server, can't insert null into primary key field?

Tags:

I'm about ready to rip my hair out on this one. I'm fairly new to MS SQL, and haven't seen a similar post anywhere.

When I try to do a statement like this:

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

I get the following:

Cannot insert the value NULL into column 'iRawMatTestCharacteristicId', table 'Intranet.dbo.qcRawMatTestCharacteristic'; column does not allow nulls. INSERT fails.

I understand the error, but the null value is for my my primary field with an int data type.

Any ideas!?

like image 399
Nick Avatar asked Oct 06 '10 20:10

Nick


2 Answers

Primary keys in any relational database are not allowed to be NULL - it's one of the main, fundamental characteristics of a primary key.

See: SQL by Design: how to Choose the primary key

Never Null
No primary key value can be null, nor can you do anything to render the primary key null. This is an inviolate rule of the relational model as supported by ANSI, of relational database management system (RDBMS) design, and of SQL Server.

UPDATE: ok, so you want an "auto-increment" primary key in SQL Server.

You need to define it as an INT IDENTITY in your CREATE TABLE statement:

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

and then when you do an INSERT, you need to explicitly specify the columns to insert, but just don't specify the "ID" column in that list - then SQL Server will handle finding the proper value automagically:

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

If you want to do this after having created the table already, you can do so in the SQL Server Management Studio's table designer:

alt text

like image 74
marc_s Avatar answered Oct 16 '22 04:10

marc_s


Primary Key fields cannot contain null values in MS SQL. If you want to populate a SQL table and dont know what to enter for a integer based primary key field then set the pk to an Identity field. Also when specifying Insert statements its wise to use the column mapping portion of the insert statment for example:

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

The reason for this is it insures that the column order is what you developed for as a SQL administrator can modify column order. It also allows you to insert a row with an identity Primary key with out specifying the value of the Primary Key Example

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

now my insert statement is simple

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

the result in the table would be

1, "John" 
like image 44
John Hartsock Avatar answered Oct 16 '22 03:10

John Hartsock