40

テーブルがほとんどなく、PDF テーブルの 1 つの列を他の複数のテーブルに参照したいと考えています。 ここに画像の説明を入力

たとえば、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;

それを作成することは可能ですか?

4

8 に答える 8

37

いいえ。

つまり、この方法で外部キー制約を作成することはできません。ただし、外部キー制約なしで外部キーを使用することはできます。

すべての外部キーは、結合で使用できる別のテーブル (または同じテーブル内の別のレコード) の主キーの値です。実際、結合に値を使用するだけでよい場合は、主キー以外のフィールドを参照できます。

ただし、外部キー制約は、テーブル内のすべての外部キー値に対して、参照されるテーブルにそれを主キーとするレコードがあるというルールを適用するようにデータベースに指示します。PDF テーブル内のすべての外部キーが4 つのテーブルすべてに主キーを持つように強制してもうまくいきません。したがって、フィールドを使用して他のレコードを参照しますが、外部キー制約は作成しないでください。

于 2013-03-21T13:59:24.027 に答える
3

それは可能であるべきです。潜在的な問題の 1 つは、3 つの外部キー制約の名前が同じであることです。

于 2013-03-21T12:22:04.930 に答える
1

いいえ、1 つの外部キー フィールドは 1 つのテーブルを参照するためのものです。

説明したように FK 制約があった場合、item_id フィールドは 3 つのテーブルすべてで同じ主キー値を参照します。3 つの異なるテーブルの目的の主キーが異なる主キーを持つ可能性が非常に高くなります。

必要なのは、1 つのレコード (行) がテーブル Product、Header、および Service のレコードを参照することです。その方法は、各外部キーに 1 つずつ、3 つの異なるフィールドを使用することです。

また、必要な3 つの外部キーが Item テーブルに含まれていることにも気付きました。PDF テーブルに Item を参照する 1 つのフィールドを持たせ、Item のレコードが他の 3 つのテーブルを参照するようにすることができます。

于 2013-03-21T12:30:32.077 に答える
0

可能性のある外部キー制約名はこのように異なる必要があり、主キーと外部キーテーブルの列はこのように同じデータ型である必要があります..

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$$
于 2013-05-28T10:48:49.273 に答える