我正在使用SQL Server。有没有办法删除没有名字的主键?
答案 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'