可以将一列引用为多个外键

ins*_*ict 26 mysql sql foreign-keys

我有几个表,我想从PDF表中引用一列到多个其他表. 在此输入图像描述

例如,如果PDF表格select输出如下所示:

ITEM_TYPE  ITEM_ID  QUANTITY

1          23       3
2          12       1
Run Code Online (Sandbox Code Playgroud)

它告诉我:

PDF上面有3个车轮产品和1个车模板标题;

我编写了SQL代码,但无法正常工作:

CREATE TABLE `pdf_created` (
    `id` INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
    `pdf_id` INT(10) NOT NULL,
    `item_type` INT(3) UNSIGNED NOT NULL,
    `item_id` INT(10) UNSIGNED NOT NULL,
    `quantity` INT(3) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `FK_pdf_id` (`pdf_id`),
    CONSTRAINT `FK_pdf_id` FOREIGN KEY (`pdf_id`) REFERENCES `pdf` (`id`),
    KEY `FK_item_type` (`item_type`),
    CONSTRAINT `FK_item_type` FOREIGN KEY (`item_type`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    KEY `FK_item_id` (`item_id`),
    CONSTRAINT `FK_item_id` FOREIGN KEY (`item_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `FK_item_id` FOREIGN KEY (`item_id`) REFERENCES `service` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `FK_item_id` FOREIGN KEY (`item_id`) REFERENCES `header` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `header` (
    `id` INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
    `title` VARCHAR(255),
    `desc` VARCHAR(65535),
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `service` (
    `id` INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
    `desc` VARCHAR(65535) NOT NULL,
    `price` DECIMAL(5,2) NOT NULL,
    `active` INT(1) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `product` (
    `id` INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
    `category_id` INT(3) UNSIGNED NOT NULL,
    `symbol` VARCHAR(255),
    `desc` VARCHAR(65535), 
    `price` DECIMAL(5,2) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

有可能创造它吗?

Mar*_*rce 25

没有.

也就是说,您不能以这种方式创建外键约束.但是,您可以使用没有外键约束的外键.

所有外键都是另一个表(或同一表中的另一个记录)主键的值,可以在连接中使用.实际上,如果只需要使用连接值,则可以引用主键以外的字段.

但是,外键约束告诉数据库强制执行以下规则:对于表中的每个外键值,引用的表都有一条记录,其中包含该键作为主键.强制PDF表中的每个外键都有一个主键在所有四个表中将不适合您.因此,继续使用该字段来引用其他记录,但只是不创建任何外键约束.


Bro*_*Lin 12

你遇到的问题叫做 Polymorphic Associations

请参考这个问题:MySQL - 条件外键约束