将主键添加到现有表
我有一个名为Persion的现有表。 在这个表中我有5列:
- persionId
- PNAME
- PMID
- Pdescription
- PAMT
当我创build这个表时,我将PersionId和Pname设置为主键。
我现在想要在主键 – PMID中添加一列。 我怎样才能写一个ALTER
语句来做到这一点? (我已经在表中有1000条logging)
放下约束并重新创build它
alter table Persion drop CONSTRAINT <constraint_name> alter table Persion add primary key (persionId,Pname,PMID)
编辑:
您可以使用下面的查询来find约束名称:
select OBJECT_NAME(OBJECT_ID) AS NameofConstraint FROM sys.objects where OBJECT_NAME(parent_object_id)='Persion' and type_desc LIKE '%CONSTRAINT'
我觉得像这样的东西应该工作
-- 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
-- create new primary key constraint ALTER TABLE dbo.persion ADD CONSTRAINT PK_persionId PRIMARY KEY NONCLUSTERED (pmid, persionId);
是一个更好的解决scheme,因为您可以控制primary_key的命名。
这比仅仅使用更好
ALTER TABLE Persion ADD PRIMARY KEY(persionId,Pname,PMID)
哪些yeilds随机化的名字,并可以导致问题时,脚本或比较数据库
如果添加主键约束
ALTER TABLE <TABLE NAME> ADD CONSTRAINT <CONSTRAINT NAME> PRIMARY KEY <COLUMNNAME>
例如:
ALTER TABLE DEPT ADD CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO)
PRIMARY KEY约束唯一地标识数据库表中的每个logging。 主键必须包含UNIQUE值,列不能包含NULL值。
-- 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)
Necromancing。
以防万一有人像我一样有模式
这里是如何正确地做到这一点:
在这个例子中,表名是dbo.T_SYS_Language_Forms,列名是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
尝试使用此代码:
ALTER TABLE `table name` CHANGE COLUMN `column name` `column name` datatype NOT NULL, ADD PRIMARY KEY (`column name`) ;
ALTER TABLE TABLE_NAME ADD PRIMARY KEY(`persionId`,`Pname`,`PMID`)