【问题标题】:SQL Table RelationsSQL 表关系
【发布时间】:2019-02-06 21:38:52
【问题描述】:

我们在 MS SQL 中有很多多年前在没有表关系的情况下创建的表。现在我们正在尝试在这些表之间创建关系。问题在于这些开发人员中的许多人在表格中使用了假 ID。

例如: 表 A,ID(主键)-> 表 B,AID 需要是关系的。但是开发人员使用了一些假的 id,比如 -1,-2 来解决他们这边的一些问题。现在,当我尝试在表 A、ID(主键)-> 表 B、AID 之间创建关系时,我遇到了错误。

表 A

ID | NAME
1  | name01
2  | name02

表 B

ID | NAME   | AID
1  | name01 | 1
2  | name02 | -1
3  | name03 | -2

有没有办法解决这个问题,开发人员所做的是否意味着完整,他们没有在 sql 中使用任何关系,他们在代码隐藏中控制一切。

谢谢

【问题讨论】:

  • 嗯,一个想法:如果软件仍然存在并尝试在 B 中创建 -3,那么如果约束不允许这样做,软件可能会崩溃。
  • @KekuSemau,我认为这是添加关系的一部分。这将是 user11022631 发现软件中很多错误的有效方式。

标签: sql sql-server database relation


【解决方案1】:

您需要将这些添加到您的参考表中。像这样的:

insert into a (id, name)
     select distinct aid, 'Automatically Generated'
     from b
     where not exists (select 1 from a where b.aid = a.id) and
           a.id is not null;

然后就可以添加外键关系了:

alter table b add constraint fk_b_aid foreign key (aid) references a(id);

【讨论】:

  • 快速解决问题的好答案。如果不需要自动生成的记录,那么唯一的方法是手动修复错误的值,然后创建外键关系。
【解决方案2】:

referential integrity 的总体思路正是您不能有无效的引用。

所以这里最好的做法是把它吸起来并手动清理它。在另一个表中创建缺少的条目,或删除记录。

【讨论】:

    【解决方案3】:

    您也可以忽略对现有数据的检查。如果您正在使用 sql server management studio 创建关系,则可以选择执行此操作,就像在此屏幕截图中一样

    希望对你有帮助

    【讨论】:

    • 可以这样做,但这会破坏您使数据库基于关系的全部努力。
    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多