Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 解决连接表之间的外部约束_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 解决连接表之间的外部约束

Sql server 解决连接表之间的外部约束,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有两个表A和B,其中A引用了B中带有外键约束的列。现在,我试图通过删除表A并使用新列再次创建表A来向表A添加更多列和约束。SQLServerMgmtStudio提供了“拖放并创建”选项来执行此操作,其中我修改了CREATETABLE语句以添加更多列 执行这些语句将抛出一个错误,指出外键约束引用了。为了解决这个问题,我必须从表A中删除外键约束,然后执行“drop and create”语句。在我的例子中,我可以通过删除一个约束来实现这一点。我无法想象在一组相互交叉引用的表格中也会这样做。 对于大

我有两个表A和B,其中A引用了B中带有外键约束的列。现在,我试图通过删除表A并使用新列再次创建表A来向表A添加更多列和约束。SQLServerMgmtStudio提供了“拖放并创建”选项来执行此操作,其中我修改了CREATETABLE语句以添加更多列

执行这些语句将抛出一个错误,指出外键约束引用了。为了解决这个问题,我必须从表A中删除外键约束,然后执行“drop and create”语句。在我的例子中,我可以通过删除一个约束来实现这一点。我无法想象在一组相互交叉引用的表格中也会这样做。 对于大多数SQL设计人员来说,这应该是一种常见的情况,我想知道是否有一种方法可以在不删除和重新创建跨表的约束网络的情况下管理这种情况

感谢您的评论

SQL示例: 当前表格:

预期表格


解决方案:不要在ManagementStudio中使用表设计器。认真地不要。它是十多年前的遗物,对SQL也不是很了解。(请访问connect.microsoft.com,您会发现许多针对它的错误和建议。)

您可以(也应该)使用SQL添加列和约束,而无需删除和重新创建表、复制数据、重新创建约束等

ALTER TABLE A ADD myNewColumn int;
ALTER TABLE A ADD CONSTRAINT ...
如果您不了解SQL的具体情况,请给出CREATETABLE/INDEX/CONSTRAINT语句,并解释需要执行的操作

添加:对于您添加到问题中的示例,下面是一行SQL。我添加了默认值,只是因为如果在添加非空列时表中已经包含数据,则需要使用默认值

ALTER TABLE dbo.TableA ADD PhotoWidth INT NOT NULL DEFAULT 640, PhotoHeight INT NOT NULL DEFAULT 480;

解决方案:不要在ManagementStudio中使用表设计器。认真地不要。它是十多年前的遗物,对SQL也不是很了解。(请访问connect.microsoft.com,您会发现许多针对它的错误和建议。)

您可以(也应该)使用SQL添加列和约束,而无需删除和重新创建表、复制数据、重新创建约束等

ALTER TABLE A ADD myNewColumn int;
ALTER TABLE A ADD CONSTRAINT ...
如果您不了解SQL的具体情况,请给出CREATETABLE/INDEX/CONSTRAINT语句,并解释需要执行的操作

添加:对于您添加到问题中的示例,下面是一行SQL。我添加了默认值,只是因为如果在添加非空列时表中已经包含数据,则需要使用默认值

ALTER TABLE dbo.TableA ADD PhotoWidth INT NOT NULL DEFAULT 640, PhotoHeight INT NOT NULL DEFAULT 480;

不,你必须放弃约束。但是好消息!™ 您可以使用
select
从信息模式表(或您的rdbms等效表)中生成
alter table drop constraint
语句


啊,但是史蒂夫·卡斯比我更仔细地阅读了你的问题。只需添加列,而不删除表,使用
altertableaddcolumn….
否,您必须删除约束。但是好消息!™ 您可以使用
select
从信息模式表(或您的rdbms等效表)中生成
alter table drop constraint
语句


啊,但是史蒂夫·卡斯比我更仔细地阅读了你的问题。只需添加列,而不删除表,使用
alter table add column…

我从未遇到过这个问题。当我修改一个表时,我使用设计器添加列,保存,它就像魔术一样工作。。。它警告我其他表引用了这个表,但我按“OK”,我的表被修改了

无论如何,您可以通过执行以下操作删除表上的引用约束:

ALTER TABLE [name] NOCHECK CONSTRAINT ALL
并使他们能够:

ALTER TABLE [name] CHECK CONSTRAINT ALL

如果要修改很多表,可以执行以下操作:

修改前:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
修改后:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

我从来没有遇到过这个问题。当我修改一个表时,我使用设计器添加列,保存,它就像魔术一样工作。。。它警告我其他表引用了这个表,但我按“OK”,我的表被修改了

无论如何,您可以通过执行以下操作删除表上的引用约束:

ALTER TABLE [name] NOCHECK CONSTRAINT ALL
并使他们能够:

ALTER TABLE [name] CHECK CONSTRAINT ALL

如果要修改很多表,可以执行以下操作:

修改前:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
修改后:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

我总是使用designer,它实际上运行得很好。大多数情况下速度也快得多。@Kevin:“大多数情况下速度”比什么快?设计器生成任何人都可以编写(但通常不应该)的SQL和/或存储过程调用。设计师的SQL和proc调用怎么可能比开发人员的SQL和proc调用更快呢?@pencilslate:这是一个单行程序。如果表包含任何数据,则必须为新列提供默认值,因为它们不为NULL。我选择了数字640和480,只是为了显示它们的去向。ALTER TABLE dbo.TableA添加PhotoWidth INT NOT NULL默认值640,PhotoHeight INT NOT NULL默认值480@史蒂夫:成功了。谢谢另外,您能推荐其他SSM的SQL设计和数据编辑工具吗?@pencilslate:SSMS是好的,如果您坚持使用查询编辑器,并通过执行SQL语句进行设计和编辑。您可以开始使用单个表的设计器,而不需要最近添加的功能,然后使用SSMS可以为您生成的脚本。使用SQL CREATE语句从头开始编写表、索引和约束的脚本并不需要很长时间。我总是使用设计器,它实际上工作得很好。大多数情况下速度也快得多。@Kevin:“大多数情况下速度”比什么快?设计器生成任何人都可以编写(但通常不应该)的SQL和/或存储过程调用。设计师的SQL和proc调用怎么可能比开发人员的SQL和proc调用更快呢?@pencilslate:这是一个单行程序。如果表包含任何数据,则必须为新列提供默认值,因为它们不为NULL。我选了一个