mysql - SQL约束: check if a bi-referenced table has common value

标签 mysql sql constraints

假设我有以下三个表:

CREATE TABLE user (
  id INTEGER NOT NULL AUTO_INCREMENT,
  /* ... */
  PRIMARY KEY(id)
)

CREATE TABLE Account (
  id INTEGER NOT NULL AUTO_INCREMENT,
  user_id INTEGER NOT NULL,
  /* ... */
  PRIMARY KEY(id),
  FOREIGN KEY(user_id) REFERENCES User(id)
)

CREATE TABLE Transfer (
  id INTEGER NOT NULL AUTO_INCREMENT,
  from_account INTEGER NOT NULL,
  to_account INTEGER NOT NULL,
  PRIMARY KEY(id),
  FOREIGN KEY(from_account) REFERENCES Account(id),
  FOREIGN KEY(to_account) REFERENCES Account(id),
  CONSTRAINT ???
  /* SELECT id FROM Account WHERE id=from_account == SELECT id FROM Account WHERE id=to_account */
)

顾名思义,转账应该引用两个帐户,但我想确保这两个帐户属于同一个人。创建表时如何解决这个问题?这可能吗?

最佳答案

不幸的是,您需要在传输表中重复user_id:

CREATE TABLE Account (
  id INTEGER NOT NULL AUTO_INCREMENT,
  user_id INTEGER NOT NULL,
  /* ... */
  PRIMARY KEY (id),
  FOREIGN KEY (user_id) REFERENCES User (id),
  UNIQUE (user_id, id)  -- redundant but needed for the foreign key constraint
);

CREATE TABLE Transfer (
  id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
  user_id INTEGER,
  from_account INTEGER NOT NULL,
  to_account INTEGER NOT NULL,
  FOREIGN KEY (user_id) REFERENCES User (id),
  FOREIGN KEY (user_id, from_account) REFERENCES Account (user_id, id),
  FOREIGN KEY (user_id, to_account) REFERENCES Account (user_id, id)
);

关于mysql - SQL约束: check if a bi-referenced table has common value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58821211/

相关文章:

php - 不会发生字符串拆分。我正在尝试使用 str_split() 函数

mysql - 如何在 MySQL 中向整数列添加正整数约束?

php - 为什么我的推进级联被外键约束阻止?

mysql - 添加外键时 Laravel/SQL 错误

Python:跟踪字典中特定值的最佳方式

mysql - 我应该如何在数据库中存储域名标签?

sql - MySQL - 限制连接中的行数?

sql - ORACLE - regexp_substr 返回空值

java - ORA-00979 : not a GROUP BY expression

MYSQL - 根据某个字段返回最近5行