Можно ссылаться на один столбец как на несколько внешних ключей - программирование
Подтвердить что ты не робот

Можно ссылаться на один столбец как на несколько внешних ключей

У меня есть несколько таблиц, и я хочу ссылаться на один столбец из таблицы PDF на несколько других таблиц. enter image description here

например, если вывод таблицы PDF select выглядит следующим образом:

ITEM_TYPE  ITEM_ID  QUANTITY

1          23       3
2          12       1

он говорит мне:

В 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;

его можно создать?

4b9b3361

Ответ 1

Нет.

То есть вы не можете создать ограничение внешнего ключа таким образом. Однако вы можете использовать внешний ключ без ограничения внешнего ключа.

Весь внешний ключ - это значение другой таблицы (или другой записи в той же таблице), которая может использоваться в соединениях. Фактически, вы можете ссылаться на поля, отличные от первичного ключа, если вам нужно только использовать значение для объединений.

Однако ограничение внешнего ключа сообщает базе данных о соблюдении правила, которое для каждого значения внешнего ключа в таблице имеет ссылочную таблицу с записью с этим в качестве первичного ключа. Обеспечение того, чтобы каждый внешний ключ в таблице PDF имел первичный ключ, во ВСЕХ ЧЕТЫРЕ ТАБЛИЦАХ не будет работать для вас. Итак, продолжайте использовать поле для ссылки на другие записи, но просто не создавайте ограничений внешнего ключа.

Ответ 3

Это должно быть возможно. Одна из потенциальных проблем заключается в том, что ваши три ограничения внешнего ключа имеют одно и то же имя.

Ответ 4

Нет, одно поле внешнего ключа предназначено для ссылки на одну таблицу.

Если у вас есть ограничения FK, как вы описываете, поле item_id будет ссылаться на одно и то же значение первичного ключа во всех трех таблицах. Было бы очень вероятно, что желаемый первичный ключ в трех разных таблицах будет иметь разные первичные ключи.

Вы хотите, чтобы одна запись (строка) указывала записи в таблицах Product, Header и Service. Способ сделать это - использовать три разных поля: по одному для каждого внешнего ключа.

Я также замечаю, что таблица Item имеет три внешних ключа. Вы можете иметь в таблице PDF одно поле, которое ссылается на Item, а запись в элементе ссылается на три другие таблицы.

Ответ 5

ya его возможное имя ограничения внешнего ключа должно быть иным, как это и первичный ключ и столбец таблицы внешнего ключа должны иметь тот же тип данных, что и этот.

CREATE TABLE `neo_address_t` (
  `address_id` varchar(8) NOT NULL,
  `address_line_1` varchar(45) NOT NULL,
  `address_line_2` varchar(45) NOT NULL,
  `address_line_3` varchar(45) NOT NULL,
  `address_city` varchar(45) NOT NULL,
  `address_zipcode` varchar(45) NOT NULL,
  `address_state` varchar(45) NOT NULL DEFAULT 'Karnataka',
  `address_country` varchar(45) NOT NULL DEFAULT 'INDIA',
  `created_by` varchar(8) DEFAULT NULL,
  `created_on` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `last_modified_by` varchar(8) DEFAULT NULL,
  `last_modified_date` timestamp NULL DEFAULT '0000-00-00 00:00:00',
  `Refer_ID` int(11) DEFAULT NULL,
  `a_id` varchar(255) DEFAULT NULL,
  `referenceid` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`address_id`),
  KEY `hospital_ID_FK_idx` (`Refer_ID`),
  CONSTRAINT `Patient_ID_FK` FOREIGN KEY (`Refer_ID`) REFERENCES `neo_patient_t` (`patient_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `hospital_ID_FK` FOREIGN KEY (`Refer_ID`) REFERENCES `neo_hospital_t` (`hospital_id`) ON DELETE NO ACTION ON UPDATE CASCADE,
  CONSTRAINT `staff_ID_FK` FOREIGN KEY (`Refer_ID`) REFERENCES `neo_staff_t` (`staff_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
)     
ENGINE=InnoDB DEFAULT CHARSET=utf8$$

Ответ 6

Теоретически вы не можете принудительно вводить несколько внешних ключей в одном столбце. В качестве альтернативы вы можете принудительно применять это, используя процедуры, в которых вы проверяете ввод, который существует в нескольких таблицах, и выполняйте необходимую операцию. Будьте осторожны, чтобы вся операция в этой конкретной таблице выполнялась процедурами, которые проверяют требуемое условие, иначе это приведет к нарушению целостности.