我不是每天都设计模式,但是当我这样做时,我会尝试正确设置级联更新/删除以使管理更容易。我了解级联的工作原理,但我永远记不起哪个表是哪个。
例如,如果我有两个表 -Parent并且Child- 在Child该引用上有一个外键Parent并且 has ON DELETE CASCADE,哪些记录触发级联,哪些记录被级联删除?我的第一个猜测是Child记录被删除时Parent记录被删除,因为Child记录依赖于Parent记录,但这ON DELETE是不明确的;这可能意味着在删除Parent记录时删除记录Child,也可能意味着在删除Child记录时删除记录Parent。那么它是哪个?
我希望语法是ON PARENT DELETE, CASCADE,ON FOREIGN DELETE, CASCADE或者类似的东西来消除歧义。有没有人有记住这一点的助记符?
我在 MySQL 数据库中有两个表 - parent, child. 我正在尝试根据父表向我的子表添加外键引用。有没有之间的任何显著差异ON UPDATE CASCADE和ON DELETE CASCADE
我的父表
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
Run Code Online (Sandbox Code Playgroud)
我的问题是:以下 sql 查询有什么区别。
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)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)使用 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) 如何在MySql中查看与表相关的外键?
背景:我想在 MySql 中删除一个具有外键约束的表。当我这样做时,我得到了这个:
Error Code: 1217. Cannot delete or update a parent row: a foreign key constraint fails
如何删除与表相关的外键离开其他人。
我注意到了MATCH SIMPLE和MATCH FULL,但我不明白它们是做什么的。我看到默认是MATCH SIMPLE; 但是,约束函数的其他MATCH子句如何FOREIGN KEY?
在外键字段上的两个表之间进行循环引用是否可以接受?
如果没有,如何避免这些情况?
如果是这样,如何插入数据?
以下是(在我看来)可以接受循环引用的示例:
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) 我正在为索引、主键和外键苦苦挣扎……并且需要拥有所有这些。
如果我有两个表,它们都有一个整数作为主键。
第一个表通过 FK 引用第二个表的主键。
table1.ref_field引用第二个表 ( table2.id)的 PK上创建了 FK 约束table1.ref_field这是组织这些索引、主键和外键的最佳方式吗?
有两个表:Deal和DealCategories。一笔交易可以有多个交易类别。
所以正确的方法应该是制作一个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)
我觉得他们这样做是错误的,但我不知道如何清楚地解释为什么这是不对的。
我该如何向他们解释这是错误的?或者也许是我错了,这是可以接受的?
如果我在 phpmyadmin 中为表 'photos' 创建外键约束,我后来看到该约束名为 'photos_ibfk_1',下一个约束名为 'photos_ibfk_2',等等。从这里我收集到 [tablename]_ibfk_constraintIndex 是MySQL 中数据库约束的约定。这样对吗?IBFK 代表什么?
我有以下架构(名称已更改),我无法更改:
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 ×10
mysql ×4
constraint ×3
postgresql ×3
innodb ×2
ddl ×1
drop-table ×1
index ×1
insert ×1
mysql-5.5 ×1
primary-key ×1
rdbms ×1
sql-server ×1