两列上的 MySQL 外键 : integer AND string

标签 mysql foreign-keys foreign-key-relationship

我有问题答案表格,每个表格都有一个主键id

以及一个具有以下结构的表votes:

CREATE TABLE `answers` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   //whatever
   PRIMARY KEY (`id`)
)
CREATE TABLE `questions` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   //whatever
   PRIMARY KEY (`id`)
)
CREATE TABLE `votes` (
  `item_model` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
  `item_id` int(10) NOT NULL,
  `vote` int(1) NOT NULL,
   KEY `item_id_model` (`item_model`,`item_id`)
)

The index on votes consists of 2 columns:
item_model: string - can have one of 2 values: 'Question' or 'Answer' 
item_id: integer  - references the question or answer's id

如何在votes 上添加外键约束以引用表questionsanswers 上的ID。有没有办法通过组合两个变量来构成唯一的引用(item_modelitem_id)?

或者我选择的投票结构是不好的做法,这意味着我应该创建两个数据透视表 answer_votequestion_vote

最佳答案

作为第一个问题的答案...

不,不可能将两列(item_model,item_id)组合成引用两个可能表的外键约束,具体取决于item_model的值。

您可以保留设计。就当前的实现而言,不可能声明这样的 FOREIGN KEY 约束。

<小时/>

就替代设计而言,可以考虑的一种可能性是定义两个个单独的列,一个作为问题的FK,另一个作为问题的FK >回答

  id            int COMMENT 'the vote id'
  item_model    ENUM('Question','Answer')
  question_id   int NULL      COMMENT 'FK ref question.id'
  answer_id     int NULL      COMMENT 'FK ref answer.id' 
  vote          TINYINT

然后我们可以声明两个单独的外键约束。

如果您想强制执行一条规则,即当 item_model 为“问题”时,answer_id 应为 NULL,question_id 应填充(非 NULL),则可以在 BEFORE INSERT 和 BEFORE UPDATE 触发器中强制执行。

关于两列上的 MySQL 外键 : integer AND string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42661389/

相关文章:

php - Yii Model->search() 条件与 MANY_MANY 关系进行比较

mysql - 如何将 2 列合并为一列并使用该合并列来保存多个值

mysql - 如何获取 SQL 中所有包的最新包?

mysql - FOREIGN KEY CONSTRAINT 的定义不起作用

sql-server-2005 - 如何查询不符合其约束的外键?

sql - 从整数转向 GUID 作为主键

PHP Mysql 进程间 TLS

mysql - 如何使用 Coldfusion 在 MySQL 中将 Word 文档存储为 BLOB

MySql 错误 150 - 外键

java - 如何获取特定数据并将其用作从 firebase 中的另一个表获取另一个数据的键