天道酬勤,学无止境

无法删除 SQL Server 2005 中的约束,“无法删除约束。 查看以前的错误”(Unable to drop constraint in SQL server 2005, “Could not drop constraint. See previous errors”)

问题

我正在尝试删除数据库表上的约束,例如:

ALTER TABLE MyTable drop CONSTRAINT FK_MyTable_AnotherTable

但执行只是运行和运行。 如果我停止它,我会看到:

Msg 3727, Level 16, State 0, Line 2
Could not drop constraint. See previous errors.

网络搜索会抛出各种页面,但请注意约束已正确命名,我正在尝试使用正确的名称将其删除

回答1

我在SQL Server 2008 R2上遇到了同样的问题,我用下面的代码解决了我的问题,希望它也适用于其他人:)

    Alter Table [Table Name]
    DROP Column [Column Name]
回答2

找到了一种对此进行排序的方法,尽管我不明白为什么需要这样做。

已经能够通过首先禁用它来删除约束:

ALTER MyTable NOCHECK CONSTRAINT FK_MyTable_AnotherTable

然后下降完成

仍然欢迎任何评论为什么这是必要的

回答3

验证您尚未删除约束,例如:

SELECT OBJECT_ID('FK_MyTable_AnotherTable')

如果这返回null ,则您的约束不再存在。 这将解释错误消息。

回答4

我有同样的问题。

原因是我在游标语句中犯了一个错误,它迭代了我要删除的一些约束。 所以这个错误发生在约束在同一个事务中被实际删除的时候。 然后我做了一个回滚并检查它是否存在:它确实存在(当然,在回滚之后!)。

在掉落的那一刻检查它是否真的存在。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • SQL Server 2005带有约束的删除列(SQL Server 2005 drop column with constraints)
    问题 我有一列具有“默认”约束。 我想创建一个删除该列的脚本。 问题是它返回此错误: Msg 5074, Level 16, State 1, Line 1 The object 'DF__PeriodSce__IsClo__4BCC3ABA' is dependent on column 'IsClosed'. Msg 4922, Level 16, State 9, Line 1 ALTER TABLE DROP COLUMN IsClosed failed because one or more objects access this column. 我找不到删除列及其所有相关约束的简便方法(只能找到可以查看系统表的大型脚本...务必(!!)是一种“不错”的方法。) 而且由于DEFAULT约束的名称是随机生成的,因此无法按名称删除它。 更新: 约束类型为“默认”。 我看到了大家都提出的解决方案,但我发现它们真的很“脏”……您不觉得吗? 我不知道它是否与Oracle或MySQL一起使用,但是可以执行以下操作: DROP COLUMN xxx CASCADE CONSTRAINTS 并且它删除所有相关的约束...或者至少它自动删除映射到该列的约束(至少是CHECK约束!) MSSQL中没有类似的东西吗? 回答1 该查询查找给定表的默认约束。 这还不错,我同意: select
  • SQL Server 2005:T-SQL暂时禁用触发器(SQL Server 2005: T-SQL to temporarily disable a trigger)
    问题 是否可以为一批命令禁用触发器,然后在批处理完成后启用它? 我确定我可以删除触发器并重新添加它,但是我想知道是否还有另一种方法。 回答1 DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } ON { object_name | DATABASE | ALL SERVER } [ ; ] http://msdn.microsoft.com/zh-CN/library/ms189748(SQL.90).aspx 其次是逆: ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } ON { object_name | DATABASE | ALL SERVER } [ ; ] http://msdn.microsoft.com/zh-CN/library/ms182706(SQL.90).aspx 回答2 有时要从外部数据源填充空数据库或调试数据库中的问题,我需要禁用所有触发器和约束。 为此,我使用以下代码: 要禁用所有约束和触发器: sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" sp_msforeachtable "ALTER TABLE ? DISABLE
  • SQL Server 2005中的原子UPSERT(Atomic UPSERT in SQL Server 2005)
    问题 在SQL Server 2005中执行原子“ UPSERT”(如果存在,则进行UPDATE,否则进行INSERT)的正确模式是什么? 我在SO上看到很多代码(例如,请参阅检查是否存在一行,否则请插入),其代码由以下两部分组成: UPDATE ... FROM ... WHERE <condition> -- race condition risk here IF @@ROWCOUNT = 0 INSERT ... 或者 IF (SELECT COUNT(*) FROM ... WHERE <condition>) = 0 -- race condition risk here INSERT ... ELSE UPDATE ... 其中<condition>将是自然键的评估。 上述方法似乎都不能很好地处理并发。 如果我不能让两行具有相同的自然键,则上述所有情况似乎都存在在竞争条件场景中插入具有相同自然键的行的风险。 我一直在使用以下方法,但是我很惊讶没有在人们的回应中看到它,因此我很奇怪它出了什么问题: INSERT INTO <table> SELECT <natural keys>, <other stuff...> FROM <table> WHERE NOT EXISTS -- race condition risk here? ( SELECT 1 FROM
  • 禁用外键约束,还是不能截断表? (SQL Server 2005)(Disabling foreign key constraint, still can't truncate table? (SQL Server 2005))
    问题 我有一个名为PX_Child的表,该表在PX_Parent上具有外键。 我想暂时禁用此FK约束,以便可以截断PX_Parent。 我不知道这是怎么回事。 我已经尝试过这些命令 ALTER TABLE PX_Child NOCHECK CONSTRAINT ALL ALTER TABLE PX_Parent NOCHECK CONSTRAINT ALL (truncate commands) ALTER TABLE PX_Child CHECK CONSTRAINT ALL ALTER TABLE PX_Parent CHECK CONSTRAINT ALL 但是截断仍然告诉我由于外键约束它不能截断PX_Parent。 我在网上四处张望,似乎找不到我在做错什么,对这个问题的基本性质感到抱歉。 回答1 如果有任何外键引用该表(包括禁用的约束),则无法截断该表。 您要么需要删除外键约束,要么使用DELETE命令。 回答2 有一种更简单的方法。 我遇到了同样的问题,并找到了以下解决方案:https://www.mssqltips.com/sqlservertip/3347/drop-and-recreate-all-foreign-key-constraints-in-sql-server/ 如果仅在数据库中运行此查询,它将生成您需要在存储过程之前/之后包含的T-SQL
  • 生成 SQL Server 的“标准”表达式形式的简单方法?(a simple way to generate SQL Server's “standard” form of an expression?)
    问题 这与 SQL Server 2005(或更高版本)中的计算列和默认约束(可能还有其他表达式)有关。 这两者都使用任意表达式来生成值,例如(year+1)用于表示“明年”的计算列(这显然是一个简单而愚蠢的示例)。 我想要做的是:我希望能够确定某个表中的现有计算列(或默认约束)是否与预期定义匹配,后者是在软件生成的模式中定义的,该模式用于创建桌子。 我可以使用sp_helptext获取计算列的定义,并从sys.default_constraints目录视图中sys.default_constraints默认约束的定义。 我遇到的问题:我从上述来源返回的表达式采用规范化/标准形式,与用于创建列/约束的形式不匹配。 在上面的示例中,SQL 将表达式规范化为([year]+(1)) 。 因此,这种形式与原始形式之间的简单字符串比较并不能可靠地确定它们是否相同。 我已经想到的解决方案: 生成原始表达式,使它们与 SQL 的形式相匹配。 这需要了解 SQL 用于生成其表单的规则,这些规则没有记录在案,因此这不是一个很好的解决方案。 将两种形式解析为 AST 并进行比较。 我已经为原始表单编写了 AST,但我没有解析器,也不想写一个。 创建一个临时表并使用原始表达式添加一个计算列,然后读回规范化的表达式。 这将非常可靠,但感觉很脏,因为理论上这种比较应该是只读操作。
  • 如何在SQL Server 2008中删除带有对象依赖项的列?(How do I drop a column with object dependencies in SQL Server 2008?)
    问题 尝试删除列时收到的错误消息: 对象“ defEmptyString”取决于列“ fkKeywordRolleKontakt”。 讯息5074,第16级,州1,第43行 ALTER TABLE DROP COLUMN fkKeywordRolleKontakt失败,因为一个或多个对象访问此列。 我已经尝试找到默认约束,如此处所述:带约束的SQL Server 2005删除列 不幸的是没有成功:(返回的行是: fkKeywordRolleKontakt 2 814625945 0 defEmptyString 而且我无法删除fkKeywordRolleKontakt和defEmptyString中的任何一个。 摆脱这种依赖性的正确方法是什么? 编辑:也许这也很重要。 列fkKeywordRolleKontakt的类型为udKeyword(nvarchar(50)),其默认dbo.defEmptyString 。 编辑2:解决 我现在可以解决问题。 抱歉,我没有复制完整的错误消息,它是: Msg 5074, Level 16, State 1, Line 1 The object 'defEmptyString' is dependent on column 'fkKeywordRolleKontakt'. Msg 5074, Level 16, State 1, Line 1
  • SQL中的TRUNCATE和DELETE有什么区别(What's the difference between TRUNCATE and DELETE in SQL)
    问题 SQL中的TRUNCATE和DELETE什么区别? 如果您的答案是特定于平台的,请指出。 回答1 这是差异列表。 我已经强调了Oracle特定的功能,希望该社区也可以增加其他供应商的特定差异。 对于大多数供应商而言,常见的差异可以直接放在标题下方,以下突出显示了差异。 总体概述 如果要快速删除表中的所有行,并且确实确定要删除表,并且没有针对表的外键,则TRUNCATE可能比DELETE快。 。 如下所述,必须考虑各种特定于系统的问题。 报表类型 删除是DML,截断是DDL(什么是DDL和DML?) 提交和回滚 由供应商可变 SQL *服务器 截断可以回滚。 PostgreSQL的 截断可以回滚。 甲骨文 因为TRUNCATE是DDL,所以它涉及两次提交,一次在语句执行之前,一次在语句执行之后。 因此,不能回滚截断,并且截断过程中的失败将仍然发出了提交。 但是,请参阅下面的闪回。 填海工程 删除不恢复空间,截断恢复空间 甲骨文 如果使用REUSE STORAGE子句,则不会取消分配数据段,如果要用表重新加载数据,这可能会稍微提高效率。 高水位标记被重置。 行范围 删除可用于删除所有行或仅删除行的子集。 截断将删除所有行。 甲骨文 对表进行分区时,可以单独截断各个分区,因此可以部分删除表的所有数据。 对象类型 删除可以应用于集群中的表和表。 截断仅适用于表或整个集群。
  • SQL DROP TABLE外键约束(SQL DROP TABLE foreign key constraint)
    问题 如果我想像这样删除数据库中的所有表,它将处理外键约束吗? 如果没有,我该如何处理? GO IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL DROP TABLE dbo.[Course] GO IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL DROP TABLE dbo.[Student] 回答1 不,如果确实存在引用它的外键,这不会删除您的表。 要获取所有引用表的外键关系,可以使用以下SQL(如果您使用的是SQL Server 2005及更高版本): SELECT * FROM sys.foreign_keys WHERE referenced_object_id = object_id('Student') 如果有的话,可以在此处使用此语句创建SQL语句以实际删除那些FK关系: SELECT 'ALTER TABLE [' + OBJECT_SCHEMA_NAME(parent_object_id) + '].[' + OBJECT_NAME(parent_object_id) + '] DROP CONSTRAINT [' + name + ']' FROM sys.foreign_keys WHERE referenced_object_id = object_id('Student'
  • 如何在SQL Server 2005中使用SQL查询更改表中的列顺序?(How to change column order in a table using sql query in sql server 2005?)
    问题 如何在SQL Server 2005中使用SQL查询更改表中的列顺序? 我想使用SQL查询重新排列表中的列顺序。 回答1 你不能。 列顺序只是我们人类关心的“美容”问题-对于SQL Server,它几乎总是绝对无关紧要的。 当您更改列顺序时,SQL Server Management Studio在后台执行的操作是使用新的CREATE TABLE命令从头开始重新CREATE TABLE ,从旧表中复制数据,然后将其删除。 没有SQL命令来定义列顺序。 回答2 您必须按照希望它们返回的顺序显式列出这些字段,而不是在“默认”顺序中使用*。 原始查询: select * from foobar 退货 foo bar --- --- 1 2 现在写 select bar, foo from foobar bar foo --- --- 2 1 回答3 根据http://msdn.microsoft.com/en-us/library/aa337556.aspx 使用Transact-SQL语句不支持此任务。 好吧,可以通过create /复制/ drop /重命名来完成,如komma8.komma1回答 或者您可以使用SQL Server Management Studio 在“对象资源管理器”中,右键单击包含要重新排序的列的表,然后单击“设计” (在2005
  • DELETE 语句与 REFERENCE 约束冲突。
    DELETE 语句与 REFERENCE 约束"FK_EQURETUR_ASS18_EQURETUR"冲突。该冲突发生于数据库"LogisticPark",表"dbo.EquReturnCharge", column 'EquReturnGUID'。语句已终止。外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中没有的值。 (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。(4)更新主键记录时,同样有级联更新和拒绝执行的选择。INSERT 和 UPDATE 规范类别展开以显示有关该关系的“删除规则”和“更新规则”的信息。删除规则指定当数据库的最终用户尝试删除某一行,而该行包含外键关系所涉及的数据时所发生的情况。如果设置为: Restrict(限制)︰如果有从行就不能删除父行。 Cascade(级联)︰删除父表中的行会自动删除从表中的任何相关行。 No Action(无动作)︰这是默认的情况,如果有从行就不能删除父行。和restrict的区别在于何时执行约束。 Set Null(置空)︰该规则确保在父表删除一行时,讲从表的外键置空(如果允许空的话),行的其它列保持不变。更新规则指定当数据库的用户尝试更新某一行,而该行包含外键关系所涉及的数据时所发生的情况。如果设置为:Restrict
  • SQL Server的隐藏功能(Hidden Features of SQL Server)
    问题 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 SQL Server的一些隐藏功能是什么? 例如,未记录的系统存储过程,做一些有用的技巧却没有足够记录的技巧? 答案 感谢大家提供的所有出色答案! 存储过程 sp_msforeachtable:使用“?”运行命令替换为每个表名(v6.5及更高版本) sp_msforeachdb:使用“?”运行命令替换为每个数据库名称(v7及更高版本) sp_who2:与sp_who一样,但包含更多有关故障排除块的信息(v7及更高版本) sp_helptext:如果需要存储过程的代码,请查看&UDF sp_tables:返回范围内数据库的所有表和视图的列表。 sp_stored_procedures:返回所有存储过程的列表 xp_sscanf:将数据从字符串读取到每个格式参数指定的参数位置。 xp_fixeddrives::查找具有最大可用空间的固定驱动器 sp_help:如果要了解表的结构,表的索引和约束。 以及视图和UDF。 快捷键是Alt + F1 片段 以随机顺序返回行上次修改日期的所有数据库用户对象仅返回日期查找哪个日期属于当前星期内的记录。 查找上周发生日期的记录。 返回当前星期开始的日期。 返回上周开始的日期。
  • 数据库触发器(Database triggers)
    问题 过去,我从来都不喜欢在数据库表上使用触发器。 在我看来,它们始终代表着数据库方面将要发生的“魔术”,与我的应用程序代码的控制相距甚远。 我还想限制数据库必须完成的工作量,因为它通常是共享资源,而且我一直认为触发器在高负载情况下可能会变得昂贵。 就是说,我发现了一些使用触发器有意义的实例(至少在我看来它们是有意义的)。 但是最近,我发现自己处于有时可能需要“绕过”触发器的情况。 对于必须寻找实现此目标的方法,我感到内gui,并且我仍然认为,更好的数据库设计可以减轻这种绕过的需要。 不幸的是,这个数据库被多个应用程序使用,其中一些由非常不合作的开发团队维护,他们会大声疾呼架构更改,因此我陷入了困境。 关于触发器的一般共识是什么? 爱他们吗? 讨厌他们吗? 认为它们在某些情况下可以达到目的吗? 是否认为需要绕过触发器就意味着您“做错了”? 回答1 触发器通常使用不正确,会引入错误,因此应避免使用。 永远不要设计触发器来执行跨表行的完整性约束检查(例如,“按部门划分的平均薪水不能超过X”)。 Oracle副总裁Tom Kyte表示,他希望删除触发器作为Oracle数据库的功能,因为触发器经常在错误中起作用。 他知道这只是一个梦想,触发器仍然存在,但是如果他能够从Oracle中删除触发器,他将(以及WHEN OTHERS子句和自主事务)。 触发器可以正确使用吗? 绝对地。 问题是
  • SQL Server 中“WITH SCHEMABINDING”的缺点?(Downsides to “WITH SCHEMABINDING” in SQL Server?)
    问题 我有一个数据库,其中有数百个命名笨拙的表(CG001T、GH066L 等),并且我对每个表都有“友好”名称的视图(例如,视图“CUSTOMERS”是“SELECT * FROM GG120T”) . 我想在我的视图中添加“WITH SCHEMABINDING”,这样我就可以拥有一些与之相关的优势,比如能够索引视图,因为少数视图具有计算列,这些列在运行时计算成本很高。 SCHEMABINDING 这些视图有缺点吗? 我发现一些文章含糊地暗示了缺点,但从未详细介绍过。 我知道,一旦视图绑定到模式,您就不能在不先删除视图的情况下更改任何会影响视图的内容(例如,列数据类型或排序规则),所以这是一个,但除此之外呢? 似乎索引视图本身的能力远远超过了更仔细地规划架构修改的缺点。 回答1 一个都没有。 这样更安全。 我们到处使用它。 回答2 您将无法更改/删除表,除非您先删除视图。 回答3 哦,使用 SCHEMABINDING肯定有缺点- 这些来自于 SCHEMABINDING 的事实,特别是当与计算列“锁定”关系并使得一些“微不足道的变化”几乎不可能时。 创建一个表。 创建一个 SCHEMABOUND UDF。 创建一个引用 UDF 的 COMPUTED PERSISTED 列。 在所述列上添加一个 INDEX。 尝试更新 UDF。 祝一切顺利! 不能删除或更改 UDF,因为它是
  • 分区级别的删除索引(drop index at partition level)
    问题 您是否知道在SQL Server(2008)中是否可以执行此操作? 我正在处理DataWarehouse的加载过程,所以我要做的是删除正在加载的分区的索引,这样我可以执行快速批量加载,然后可以在分区级别再次重建索引。 我认为在Oracle中可以实现这一目标,但在SQL Server中则可能无法实现。 谢谢,维克多 回答1 不,您不能仅删除单个分区的表索引。 但是,SQL 2008提供了一种批量加载的方法,该方法包括在同一文件组的单独分区上设置具有完全相同的架构的第二个表,加载该表,以精确的方式对其建立索引,然后使用以下方式“切换”新分区:生产表上现有的空分区。 但是,这是一个高度简化的描述。 这是有关SQL 2008的MSDN文章,关于如何实现这一点:http://msdn.microsoft.com/zh-cn/library/ms191160.aspx 回答2 我知道在SQL 2005中是不可能的。我在2008年还没有听说过任何可以让您这样做的东西,但是它可能在那里(我已经读过但还没有使用过)。 我能得到的最接近的是禁用索引,但是如果禁用聚集索引,则无法再访问该表。 没那么有用,恕我直言。 对于Warehouse ETL项目,我的解决方案是创建一个列出所有索引和索引约束(PK,UQ)的表。 在ETL期间,我们遍历表(对于要加载的所需表集),删除索引/索引约束,加载数据
  • SQLSERVER数据库、表的创建及SQL语句命令
    SQLSERVER数据库,安装、备份、还原等问题: 一、存在已安装了sql server 2000,或2005等数据库,再次安装2008,会出现的问题 1、卸载原来的sql server 2000、2005,然后再安装sql server 2008,否则经常sql server服务启动不了 2、sql server服务启动失败,解决方法: 进入sql server configure manager,点开 Sql server 网络配置(非sql native client 配置),点sqlzhh(我sqlserver的名字)协议,将VIA协议禁用。再启动Sql Server服务,成功 如图: 二、在第一次安装SQLSERVER2008结束后,查看安装过程明细,描述中有较多项插件或程度,显示安装失败。 解决方法: 1、重新启动安装程度setup.exe,选择进行修复安装,至完成即可。 三、先创建数据库XXX,再进行还原数据库时,选择好备份文件XXX.bak,确定后进行还原,会报如下图的错误。 解决方法: 选择好备份数据库文件后,再进入“选项”中,勾选“覆盖现在数据库”即可。 四、查看数据库版本的命令:select @@version 在数据库中,点击“新建查询”,然后输入命令,执行结果如下 五、数据库定义及操作命令: 按照数据结构来组织、存储和管理数据的仓库。由表
  • 如何以编程方式更改标识列的值?(How to change identity column values programmatically?)
    问题 我有一个MS SQL 2005数据库,其中的表Test具有列ID 。 ID是一个标识列。 我在此表中有行,并且所有行都有其对应的ID自动递增值。 现在,我想像这样更改此表中的每个ID: ID = ID + 1 但是,当我这样做时,我得到一个错误: 无法更新标识列“ ID”。 我已经试过了: ALTER TABLE Test NOCHECK CONSTRAINT ALL set identity_insert ID ON 但这不能解决问题。 我需要在此列设置标识,但是我还需要不时更改值。 所以我的问题是如何完成这项任务。 回答1 你需要 set identity_insert YourTable ON 然后删除您的行,然后以其他身份重新插入。 完成插入操作后,不要忘记关闭identity_insert set identity_insert YourTable OFF 回答2 IDENTITY列的值是不可变的。 但是,可以切换表元数据以删除IDENTITY属性,进行更新,然后再切换回去。 假设以下结构 CREATE TABLE Test ( ID INT IDENTITY(1,1) PRIMARY KEY, X VARCHAR(10) ) INSERT INTO Test OUTPUT INSERTED.* SELECT 'Foo' UNION ALL SELECT 'Bar'
  • 带数据循环的SQL Server 2005递归查询-是否可能?(SQL Server 2005 recursive query with loops in data - is it possible?)
    问题 我有一个标准的老板/下属员工表。 我需要选择一个老板(由ID指定)及其所有下属(及其下属等)。 不幸的是,现实世界中的数据存在一些循环(例如,两家公司的所有人都被对方设置为老板)。 带有CTE的简单递归查询就此阻塞了(最大递归级别超过了100)。 仍然可以选择雇员吗? 我不在乎选择它们的顺序,只是每个选择一次。 补充:您要我的查询吗? 嗯...好吧...我虽然很明显,但是-这里是: with UserTbl as -- Selects an employee and his subordinates. ( select a.[User_ID], a.[Manager_ID] from [User] a WHERE [User_ID] = @UserID union all select a.[User_ID], a.[Manager_ID] from [User] a join UserTbl b on (a.[Manager_ID]=b.[User_ID]) ) select * from UserTbl 补充2:哦,如果不清楚,这是生产系统,我必须做一些升级(基本上添加某种报告)。 因此,如果可以避免的话,我宁愿不要修改数据。 回答1 我知道已经有一段时间了,但是我想我应该分享我的经验,因为我尝试了每个解决方案,这是我的发现的摘要(也许这篇文章?):
  • 在星型模式中,事实和维度之间的外键约束是否必要?(In a star schema, are foreign key constraints between facts and dimensions neccessary?)
    问题 我第一次接触数据仓库,我想知道是否有必要在事实和维度之间建立外键约束。 没有它们有什么重大缺点吗? 我目前正在使用关系星型架构。 在传统的应用程序中,我已经习惯了使用它们,但是我开始怀疑在这种情况下是否需要它们。 我目前在SQL Server 2005环境中工作。 更新:对于那些感兴趣的人,我碰到了一个民意测验,问了同样的问题。 回答1 大多数数据仓库(DW)都没有将外键实现为约束,因为: 通常,外键约束将在以下条件上触发:向事实表中插入,任何键更新以及从维表中删除。 在加载期间,删除索引和约束以加快加载过程,ETL应用程序强制执行数据完整性。 表加载后,DW本质上是只读的-约束不会在读取时触发。 加载后将重建所有必需的索引。 删除DW是受控过程。 在从维度删除行之前,向事实表查询要删除的行的键-仅当这些键在任何事实表中不存在时才允许删除。 以防万一,定期运行查询以检测事实表中的孤立记录是很常见的。 回答2 我们使用它们,对此感到满意。 在数据仓库(关系)中具有外键是否是一种好习惯? 有开销,但是您始终可以在加载期间禁用约束,然后重新启用它。 约束到位可以捕获ETL错误和建模缺陷。 回答3 我认为从理论上讲,您需要这样做。 但这取决于您如何通过数据库分离数据。 如果所有它们都在同一个数据库中,那么外键可以为您提供帮助,因为设置外键将帮助数据库根据索引更快地进行选择。
  • SQL Server 2005如何创建唯一约束?(SQL Server 2005 How Create a Unique Constraint?)
    问题 如何在SQL Server 2005中的现有表上创建唯一约束? 我正在寻找TSQL以及如何在数据库图中执行它。 回答1 SQL命令是: ALTER TABLE <tablename> ADD CONSTRAINT <constraintname> UNIQUE NONCLUSTERED ( <columnname> ) 请参阅此处的完整语法。 如果要从数据库关系图执行此操作: 右键点击表格,然后选择“索引/键” 单击添加按钮添加新索引在右侧的属性中输入必要的信息: 所需的列(单击省略号按钮进行选择) 将“唯一”设置为“是” 给它起一个合适的名字 回答2 在SQL Server Management Studio Express中: 右键单击表,选择“修改”或“设计”(对于更高版本) 右键单击字段,选择索引/键... 点击添加对于“列” ,选择要唯一的字段名称。 对于“类型” ,选择“唯一键” 。 点击关闭,保存表格。 回答3 ALTER TABLE [TableName] ADD CONSTRAINT [constraintName] UNIQUE ([columns]) 回答4 警告:您设置为唯一的列中只能有一个空行。 您可以使用SQL 2008中的筛选索引来执行此操作: CREATE UNIQUE NONCLUSTERED INDEX idx_col1 ON dbo
  • SQL Server 有效地删除具有数百万行的一组行(SQL Server Efficiently dropping a group of rows with millions and millions of rows)
    问题 我最近问了这个问题:MS SQL 在表中共享身份种子(很多人想知道为什么) 我有以下表格布局: 表:星星星号大整数类别 ID 大整数星名 varchar(200) 但我的问题是我有数百万行。 因此,当我想从 Stars 表中删除星星时,它在 SQL Server 上过于密集。 我无法使用 2005+ 的内置分区,因为我没有企业许可证。 但是,当我删除时,我总是一次删除整个类别 ID。 我想过做这样的设计: 表:Star_1 星号大整数 CategoryId bigint 常量岩石=1 星名 varchar(200) 表:Star_2 星号大整数 CategoryId bigint 常量rock=2 星名 varchar(200) 通过这种方式,我可以通过执行简单的删除表删除整个类别,从而删除 O(1) 中的数百万行。 我的问题是,在您的 SQL Server 中拥有数十万个表是否有问题? O(1) 的下降对我来说是非常可取的。 也许我没有想到一个完全不同的解决方案? 编辑: 星星插入后是否会被修改? 不。 您是否曾经需要跨星级类别进行查询? 我永远不必跨星级类别进行查询。 如果您正在寻找特定恒星的数据,您知道要查询哪个表吗? 是的 输入数据时,应用程序将如何决定将数据放入哪个表? 星型数据的插入是在创建 categoryId 的开始时一次性完成的。 会有多少个类别?