【问题标题】:Change data type/constraint of column更改列的数据类型/约束
【发布时间】:2018-03-13 16:46:00
【问题描述】:

我有一个现有的列 people,其中包含一个列 pid。我想将pid 更改为:

  • int -> 5 个字符的长字符串

  • 唯一 -> 在 pidcompany_id 中唯一(外键)

我目前没有在我的 mssql 数据库中使用 pid,因此我可以删除该列。我的理解是,我必须将我的任务分解为三个步骤:

  1. 删除列
  2. 添加列
  3. 为列添加唯一性

我的 mssql 语句会是这样吗:

ALTER TABLE people DROP COLUMN pid;
ALTER TABLE people ADD pid VARCHAR(5);
ALTER TABLE people ADD CONSTRAINT unique_pid UNIQUE (pid, company_id);

我已执行上述 mssql 语句,但在我的 people 中没有看到 pid 列。我没有注意到任何错误被抛出,我想在深入研究之前验证我的陈述是否正确。

【问题讨论】:

  • 那么,您的问题到底是什么?如果是“上面的 SQL 会起作用吗?”您是否尝试过(可能在开发环境中)?如果不是,为什么不呢?去尝试一下(再次,首先使用开发环境,这就是他们的目的)!如果是,并且它确实起作用了,那么问题是什么?如果它不起作用,是什么问题?
  • @Larnu - 糟糕,我忘了添加我的问题。我已经尝试过我的陈述,但我再也看不到pid 列了。我也没有看到任何错误。
  • 你刷新 SSMS 了吗?

标签: sql-server


【解决方案1】:

我想问题是批处理失败了。可能的原因是您需要在创建CONSTRAINT 之前为pid 设置一个值。如果您的表中有任何数据并且company_id 不是唯一的,那么您将有重复的值。因此,作为一个简单的示例,以下将起作用:

CREATE TABLE #people (pid int, company_id int)
GO

SELECT *
FROM #people;
GO

ALTER TABLE #people DROP COLUMN pid;
ALTER TABLE #people ADD pid VARCHAR(5);
ALTER TABLE #people ADD CONSTRAINT unique_pid UNIQUE (pid, company_id);
GO

SELECT *
FROM #people;
GO

DROP TABLE #people;

但是,如果我先将一些数据放入表中,则批处理将失败:

CREATE TABLE #people (pid int, company_id int)
GO

INSERT INTO #people (company_id)
VALUES (1),(1),(2);
GO
SELECT *
FROM #people;
GO

ALTER TABLE #people DROP COLUMN pid;
ALTER TABLE #people ADD pid VARCHAR(5);
ALTER TABLE #people ADD CONSTRAINT unique_pid UNIQUE (pid, company_id);
GO

SELECT *
FROM #people;
GO

DROP TABLE #people;

在这种情况下,我实际上还有pid 列,但是CONSTRAINT 失败了。根据您进行事务的位置,很可能是 DROP 已提交,但是,ADD 已与 ADD CONSTRAINT 一起回滚。

要解决此问题,您需要先使用相关数据填充(新)列pid,然后添加您的CONSTRAINT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 2014-12-15
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多