标签: foreign-key

级联(ON DELETE/UPDATE)行为的良好解释

我不是每天都设计模式,但是当我这样做时,我会尝试正确设置级联更新/删除以使管理更容易。我了解级联的工作原理,但我永远记不起哪个表是哪个。

例如,如果我有两个表 -Parent并且Child- 在Child该引用上有一个外键Parent并且 has ON DELETE CASCADE,哪些记录触发级联,哪些记录被级联删除?我的第一个猜测是Child记录被删除时Parent记录被删除,因为Child记录依赖于Parent记录,但这ON DELETE是不明确的;这可能意味着在删除Parent记录时删除记录Child,也可能意味着在删除Child记录时删除记录Parent。那么它是哪个?

我希望语法是ON PARENT DELETE, CASCADEON FOREIGN DELETE, CASCADE或者类似的东西来消除歧义。有没有人有记住这一点的助记符?

mysql foreign-key

135
推荐指数
4
解决办法
26万
查看次数

mysql 中 On Delete Cascade 和 On Update Cascade 的区别

我在 MySQL 数据库中有两个表 - parent, child. 我正在尝试根据父表向我的子表添加外键引用。有没有之间的任何显著差异ON UPDATE CASCADEON DELETE CASCADE

我的父表

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)

我的问题是:以下 sql 查询有什么区别。

  1. ON DELETE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON DELETE CASCADE
    ) ENGINE=INNODB;
    
    Run Code Online (Sandbox Code Playgroud)
  2. ON UPDATE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON UPDATE CASCADE
    ) …
    Run Code Online (Sandbox Code Playgroud)

mysql innodb foreign-key mysql-5.5

85
推荐指数
3
解决办法
19万
查看次数

如何插入包含外键的行?

使用 PostgreSQL v9.1。我有以下表格:

CREATE TABLE foo
(
    id BIGSERIAL     NOT NULL UNIQUE PRIMARY KEY,
    type VARCHAR(60) NOT NULL UNIQUE
);

CREATE TABLE bar
(
    id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY,
    description VARCHAR(40) NOT NULL UNIQUE,
    foo_id BIGINT NOT NULL REFERENCES foo ON DELETE RESTRICT
);
Run Code Online (Sandbox Code Playgroud)

假设第一个表foo是这样填充的:

INSERT INTO foo (type) VALUES
    ( 'red' ),
    ( 'green' ),
    ( 'blue' );
Run Code Online (Sandbox Code Playgroud)

有没有办法bar通过引用foo表轻松插入行?或者我必须分两步完成,首先查找foo我想要的类型,然后在其中插入一个新行bar

这是一个伪代码示例,显示了我希望可以完成的工作:

INSERT INTO bar (description, foo_id) VALUES
    ( …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-key insert postgresql-9.1

77
推荐指数
3
解决办法
37万
查看次数

如何检查与表相关的外键

如何在MySql中查看与表相关的外键?

背景:我想在 MySql 中删除一个具有外键约束的表。当我这样做时,我得到了这个:

Error Code: 1217. Cannot delete or update a parent row: a foreign key constraint fails

如何删除与表相关的外键离开其他人。

mysql foreign-key constraint drop-table

55
推荐指数
1
解决办法
12万
查看次数

MATCH FULL、MATCH SIMPLE 和 MATCH PARTIAL 之间的区别?

我注意到了MATCH SIMPLEMATCH FULL,但我不明白它们是做什么的。我看到默认是MATCH SIMPLE; 但是,约束函数的其他MATCH子句如何FOREIGN KEY

postgresql foreign-key constraint referential-integrity ddl

46
推荐指数
2
解决办法
4万
查看次数

循环外键引用是否可以接受\如何避免它们?

在外键字段上的两个表之间进行循环引用是否可以接受?

如果没有,如何避免这些情况?

如果是这样,如何插入数据?

以下是(在我看来)可以接受循环引用的示例:

CREATE TABLE Account
(
    ID INT PRIMARY KEY IDENTITY,
    Name VARCHAR(50)
)

CREATE TABLE Contact
(
    ID INT PRIMARY KEY IDENTITY,
    Name VARCHAR(50),
    AccountID INT FOREIGN KEY REFERENCES Account(ID)
)

ALTER TABLE Account ADD PrimaryContactID INT FOREIGN KEY REFERENCES Contact(ID)
Run Code Online (Sandbox Code Playgroud)

rdbms foreign-key database-design

38
推荐指数
2
解决办法
4万
查看次数

需要外键索引

我正在为索引、主键和外键苦苦挣扎……并且需要拥有所有这些。

如果我有两个表,它们都有一个整数作为主键。
第一个表通过 FK 引用第二个表的主键。

  • 在两个表上,我在 ID 列上都有一个主键索引
  • 我在table1.ref_field引用第二个表 ( table2.id)的 PK上创建了 FK 约束
  • 我在上面添加了一个索引 table1.ref_field

这是组织这些索引、主键和外键的最佳方式吗?

postgresql index foreign-key database-design primary-key

37
推荐指数
1
解决办法
3万
查看次数

使用多个由逗号分隔的外键是否错误,如果是,为什么?

有两个表:DealDealCategories。一笔交易可以有多个交易类别。

所以正确的方法应该是制作一个DealCategories具有以下结构的表:

DealCategoryId (PK)
DealId (FK)
DealCategoryId (FK)
Run Code Online (Sandbox Code Playgroud)

但是,我们的外包团队以Deal这种方式将多个类别存储在表中:

DealId (PK)
DealCategory -- In here they store multiple deal ids separated by commas like this: 18,25,32.
Run Code Online (Sandbox Code Playgroud)

我觉得他们这样做是错误的,但我不知道如何清楚地解释为什么这是不对的。

我该如何向他们解释这是错误的?或者也许是错了,这是可以接受的?

foreign-key database-design

32
推荐指数
1
解决办法
7082
查看次数

'ibfk' 在 MySQL 中代表什么?

如果我在 phpmyadmin 中为表 'photos' 创建外键约束,我后来看到该约束名为 'photos_ibfk_1',下一个约束名为 'photos_ibfk_2',等等。从这里我收集到 [tablename]_ibfk_constraintIndex 是MySQL 中数据库约束的约定。这样对吗?IBFK 代表什么?

mysql innodb foreign-key constraint

31
推荐指数
2
解决办法
3万
查看次数

当表引用自身时,如何编写查找所有循环引用的查询?

我有以下架构(名称已更改),我无法更改:

CREATE TABLE MyTable (
    Id INT NOT NULL PRIMARY KEY,
    ParentId INT NOT NULL
);

ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id);
Run Code Online (Sandbox Code Playgroud)

也就是说,每条记录都是另一条记录的子项。如果记录的ParentId等于其Id,则该记录被视为根节点。

我想运行将找到所有循环引用的查询。例如,随着数据

INSERT INTO MyTable (Id, ParentId) VALUES
    (0, 0),
    (1, 0),
    (2, 4),
    (3, 2),
    (4, 3);
Run Code Online (Sandbox Code Playgroud)

查询应该返回

Id | Cycle
2  | 2 < 4 < 3 < 2
3  | 3 < 2 < 4 < 3
4  | 4 < 3 < 2 < 4
Run Code Online (Sandbox Code Playgroud)

我为 SQL …

foreign-key sql-server sql-server-2008-r2

28
推荐指数
1
解决办法
2万
查看次数