如何删除没有名称的主键?

时间:2011-05-02 10:59:11

标签: sql-server

我正在使用SQL Server。有没有办法删除没有名字的主键?

3 个答案:

答案 0 :(得分:8)

它确实有一个名字。即使您没有明确地命名它,SQL Server也会根据约束的表名和PK自动创建一个前缀为object_id的名称。

您可以使用以下查询查看它是什么。

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE='PRIMARY KEY' AND TABLE_SCHEMA='dbo' AND TABLE_NAME='T'

DROP CONSTRAINT操作的约束名is required in the grammar

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name 
{ 
   ....
    DROP 
    { 
        [ CONSTRAINT ] constraint_name 
        [ WITH ( <drop_clustered_constraint_option> [ ,...n ] ) ]
        | COLUMN column_name 
    } [ ,...n ] 

答案 1 :(得分:4)

主键始终具有名称。如果未在“create table”或“alter table”语句中指定它,则会自动生成密钥名称 在下面的查询中,将X替换为表的名称并运行脚本 它将丢弃主键。

declare @TableName sysname = 'X'

declare @PrimaryKeyName sysname = (
    select name
    from sys.key_constraints
    where type = 'PK' and parent_object_id = object_id(@TableName))

execute ('alter table ' + @TableName + ' drop constraint ' + @PrimaryKeyName)   

为约束指定显式名称总是一个好主意,因为如果在不同的数据库上运行'create / alter table'脚本,则所有数据库都会创建不同的约束名称。
稍后,当您需要删除运行此变通脚本所需的约束时,只需运行简单的“alter table drop constraint”语句。

答案 2 :(得分:0)

CREATE TABLE #Tempbox (Id int primary key identity(1,1), Name varchar(200) unique) 

创建一个包含列Id和名称的表,注意它没有约束名称。

好吧,如果你没有为列设置约束名,sql server会提供自己的默认唯一约束名来约束主键,唯一等等。

1. Let's insert some value in our #Tempbox table

1. insert into #tempbox values ('Abc')
2. insert into #tempbox values ('Abc')

sql server显示的唯一键冲突错误以及约束名称。

**Msg 2627, Level 14, State 1, Line 5
Violation of UNIQUE KEY constraint **'UQ__#Tempbox__737584F6A146D511'**. Cannot insert duplicate key in object 'dbo.#Tempbox'. The duplicate key value is (dsaf).
The statement has been terminated.**

你现在有了约束名称..这是&#39; UQ __#Tempbox__737584F6A146D511&#39;

现在让我们放下有约束的列。请记住,如果列使用约束,则无法删除列,因此为了删除该列,您必须删除第一个约束并在列之后删除。

<强> ALTER TABLE #Tempbox drop constraint UQ__#Tempbox__737584F6A146D511; -- constraint is dropped

现在删除列

alter table #tempbox drop column Name

现在对主键列使用相同的过程

INSERT INTO #Tempbox (Id, Name) VALUES (1,'Abc')
INSERT INTO #Tempbox (Id, Name) VALUES (1,'Abc')

错误:

Msg 2627, Level 14, State 1, Line 3
Violation of PRIMARY KEY constraint **'PK__#Tempbox__3214EC07B3D09900'**. Cannot insert duplicate key in object 'dbo.#Tempbox'. The duplicate key value is (1).
The statement has been terminated.

删除约束和删除列。

查找约束名称的另一种方法..

USE Adventure 

SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE='PRIMARY KEY' AND TABLE_SCHEMA='pERSON' AND TABLE_NAME='PERSON'