更改SQL Server中的主键列

ckb*_*dge 49 sql database sql-server shared-hosting

UPDATE

以下是查询结果的约束

SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'history'

CONSTRAINT_NAME   COLUMN_NAME  ORDINAL_POSITION
PK_history        userKey       1
PK_history        name          2
Run Code Online (Sandbox Code Playgroud)

这是查询的结果

SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE TABLE_NAME = 'history'

CONSTRAINT_NAME   CONSTRAINT_TYPE  IS_DEFERRABLE  INITIALLY_DEFERRED
PK_history        PRIMARY KEY      NO             NO
Run Code Online (Sandbox Code Playgroud)

结束更新

我的主机通过ASP.NET企业管理器为我的SQL Server数据库提供了一个接口.

我的表中有3列history:

  • userId (key,int,NULL不允许)
  • name (键,字符串,不允许NULL)
  • id (不是key,int,允许NULL)

我想让id列成为唯一的关​​键.

要做到这一点,我相信我需要:

  1. 确保任何行的该列中没有NULL
  2. 将列设置为不允许NULL
  3. 将列添加为主键
  4. 删除其他2列作为键

但是,当我使用提供的UI时,它永远不会起作用.有时它看起来只是尝试做某事但是当我刷新列的视图时它永远不会改变.它偶尔会创建一个临时表,看起来它试图执行某些操作,但永远不会被复制/覆盖我正在尝试更改的原始表.

当我尝试使用查询时,更改也不会显示.以下是我认为我需要的查询:

    SELECT * from history WHERE id is NULL     <---- This shows 0 results

    ALTER TABLE history
    ALTER COLUMN id int NOT NULL

    ALTER TABLE history ADD PRIMARY KEY (id)

    ALTER TABLE history
    DROP CONSTRAINT userId
    DROP CONSTRAINT name
    GO
Run Code Online (Sandbox Code Playgroud)

我只是试图禁止NULL并为id列添加主键.它似乎不起作用.有人能指出我正确的方向吗?谢谢!

com*_*ech 73

假设您当前的主键约束称为pk_history,您可以替换以下行:

ALTER TABLE history ADD PRIMARY KEY (id)

ALTER TABLE history
DROP CONSTRAINT userId
DROP CONSTRAINT name
Run Code Online (Sandbox Code Playgroud)

用这些:

ALTER TABLE history DROP CONSTRAINT pk_history

ALTER TABLE history ADD CONSTRAINT pk_history PRIMARY KEY (id)
Run Code Online (Sandbox Code Playgroud)

如果您不知道PK的名称是什么,可以使用以下查询找到它:

SELECT * 
  FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
 WHERE TABLE_NAME = 'history'
Run Code Online (Sandbox Code Playgroud)