Add primary key to existing table

SqlSql ServerSql Server-2008ConstraintsPrimary Key

Sql Problem Overview


I have an existing table called Persion. In this table I have 5 columns:

  • persionId
  • Pname
  • PMid
  • Pdescription
  • Pamt

When I created this table, I set PersionId and Pname as the primary key.

I now want to include one more column in the primary key - PMID. How can I write an ALTER statement to do this? (I already have 1000 records in the table)

Sql Solutions


Solution 1 - Sql

drop constraint and recreate it

alter table Persion drop CONSTRAINT <constraint_name>

alter table Persion add primary key (persionId,Pname,PMID)

edit:

you can find the constraint name by using the query below:

select OBJECT_NAME(OBJECT_ID) AS NameofConstraint
FROM sys.objects
where OBJECT_NAME(parent_object_id)='Persion'
and type_desc LIKE '%CONSTRAINT'

Solution 2 - Sql

I think something like this should work

-- drop current primary key constraint
ALTER TABLE dbo.persion 
DROP CONSTRAINT PK_persionId;
GO

-- add new auto incremented field
ALTER TABLE dbo.persion 
ADD pmid BIGINT IDENTITY;
GO

-- create new primary key constraint
ALTER TABLE dbo.persion 
ADD CONSTRAINT PK_persionId PRIMARY KEY NONCLUSTERED (pmid, persionId);
GO

Solution 3 - Sql

-- create new primary key constraint
ALTER TABLE dbo.persion 
ADD CONSTRAINT PK_persionId PRIMARY KEY NONCLUSTERED (pmid, persionId);

is a better solution because you have control over the naming of the primary_key.


It's better than just using

ALTER TABLE Persion ADD PRIMARY KEY(persionId,Pname,PMID)

which yeilds randomized names and can cause problems when scripting out or comparing databases

Solution 4 - Sql

If you add primary key constraint

ALTER TABLE <TABLE NAME> ADD CONSTRAINT <CONSTRAINT NAME> PRIMARY KEY <COLUMNNAME>  

for example:

ALTER TABLE DEPT ADD CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO)

Solution 5 - Sql

There is already an primary key in your table. You can't just add primary key,otherwise will cause error. Because there is one primary key for sql table.

First, you have to drop your old primary key.

MySQL:

ALTER TABLE Persion
DROP PRIMARY KEY;

SQL Server / Oracle / MS Access:

ALTER TABLE Persion
DROP CONSTRAINT 'constraint name';

> You have to find the constraint name in your table. If you had > given constraint name when you created table,you can easily use > the constraint name(ex:PK_Persion).

Second,Add primary key.

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persion ADD PRIMARY KEY (PersionId,Pname,PMID);

or the better one below

ALTER TABLE Persion ADD CONSTRAINT PK_Persion PRIMARY KEY (PersionId,Pname,PMID);

This can set constraint name by developer. It's more easily to maintain the table.

I got a little confuse when i have looked all answers. So I research some document to find every detail. Hope this answer can help other SQL beginner.

Reference:https://www.w3schools.com/sql/sql_primarykey.asp

Solution 6 - Sql

Necromancing.
Just in case anybody has as good a schema to work with as me...
Here is how to do it correctly:

In this example, the table name is dbo.T_SYS_Language_Forms, and the column name is LANG_UID

-- First, chech if the table exists...
IF 0 < (
	SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
	WHERE TABLE_TYPE = 'BASE TABLE'
	AND TABLE_SCHEMA = 'dbo'
	AND TABLE_NAME = 'T_SYS_Language_Forms'
)
BEGIN
	-- Check for NULL values in the primary-key column
	IF 0 = (SELECT COUNT(*) FROM T_SYS_Language_Forms WHERE LANG_UID IS NULL)
	BEGIN
		ALTER TABLE T_SYS_Language_Forms ALTER COLUMN LANG_UID uniqueidentifier NOT NULL 
		
        -- No, don't drop, FK references might already exist...
		-- Drop PK if exists (it is very possible it does not have the name you think it has...)
		-- ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT pk_constraint_name 
		--DECLARE @pkDropCommand nvarchar(1000) 
		--SET @pkDropCommand = N'ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT ' + QUOTENAME((SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
		--WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
		--AND TABLE_SCHEMA = 'dbo' 
		--AND TABLE_NAME = 'T_SYS_Language_Forms' 
		----AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
		--))
		---- PRINT @pkDropCommand 
		--EXECUTE(@pkDropCommand) 
	    -- Instead do
	    -- EXEC sp_rename 'dbo.T_SYS_Language_Forms.PK_T_SYS_Language_Forms1234565', 'PK_T_SYS_Language_Forms';
		
		-- Check if they keys are unique (it is very possible they might not be)		
		IF 1 >= (SELECT TOP 1 COUNT(*) AS cnt FROM T_SYS_Language_Forms GROUP BY LANG_UID ORDER BY cnt DESC)
		BEGIN
			
			-- If no Primary key for this table
			IF 0 =  
			(
				SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
				WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
				AND TABLE_SCHEMA = 'dbo' 
				AND TABLE_NAME = 'T_SYS_Language_Forms' 
				-- AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
			)
				ALTER TABLE T_SYS_Language_Forms ADD CONSTRAINT PK_T_SYS_Language_Forms PRIMARY KEY CLUSTERED (LANG_UID ASC)
			;
			
		END -- End uniqueness check
		ELSE
			PRINT 'FSCK, this column has duplicate keys, and can thus not be changed to primary key...' 
	END -- End NULL check
	ELSE
		PRINT 'FSCK, need to figure out how to update NULL value(s)...' 
END 

Solution 7 - Sql

The PRIMARY KEY constraint uniquely identifies each record in a database table. Primary keys must contain UNIQUE values and column cannot contain NULL Values.

  -- DROP current primary key 
  ALTER TABLE tblPersons DROP CONSTRAINT <constraint_name>
  Example:
  ALTER TABLE tblPersons 
  DROP CONSTRAINT P_Id;


  -- ALTER TABLE tblpersion
  ALTER TABLE tblpersion add primary key (P_Id,LastName)

Solution 8 - Sql

Please try this-

ALTER TABLE TABLE_NAME DROP INDEX `PRIMARY`, ADD PRIMARY KEY (COLUMN1, COLUMN2,..);

Solution 9 - Sql

ALTER TABLE TABLE_NAME ADD PRIMARY KEY(`persionId`,`Pname`,`PMID`)

Solution 10 - Sql

Try using this code:

ALTER TABLE `table name` 
    CHANGE COLUMN `column name` `column name` datatype NOT NULL, 
    ADD PRIMARY KEY (`column name`) ;

Solution 11 - Sql

alter table[Person] add ID int primary key IDENTITY (1,1)

This will add primary key and indentity seed and populate the new column.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjayView Question on Stackoverflow
Solution 1 - SqlJoe G JosephView Answer on Stackoverflow
Solution 2 - SqlT IView Answer on Stackoverflow
Solution 3 - Sqluser3675542View Answer on Stackoverflow
Solution 4 - SqlK GANGAView Answer on Stackoverflow
Solution 5 - Sql劉鎮瑲View Answer on Stackoverflow
Solution 6 - SqlStefan SteigerView Answer on Stackoverflow
Solution 7 - SqlMike ClarkView Answer on Stackoverflow
Solution 8 - SqlSamirView Answer on Stackoverflow
Solution 9 - SqlHarry SinghView Answer on Stackoverflow
Solution 10 - SqlRekha RajanView Answer on Stackoverflow
Solution 11 - SqlAshandra SinghView Answer on Stackoverflow