テーブルがほとんどないので、PDFテーブルから他の複数のテーブルへの1つの列を参照します。
たとえば、PDF table 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;
それを作成することは可能ですか?
いや.
つまり、この方法では外部キー制約を作成できません。ただし、外部キー制約なしで外部キーを使用できます。
すべての外部キーは、結合で使用できる別のテーブル(または同じテーブル内の別のレコード)のプライマリキーの値です。実際、結合に値を使用するだけであれば、主キー以外のフィールドを参照できます。
ただし、外部キー制約は、テーブル内のすべての外部キー値について、参照されるテーブルがそれを主キーとして持つレコードを持つというルールを実施するようデータベースに指示します。 PDFテーブルにあるすべての外部キーに主キーがあったことを強制するIN ALL FOUR TABLESは機能しません。したがって、フィールドを使用して他のレコードを作成しますが、外部キー制約は作成しません。
出会った問題はPolymorphic Associations
この質問を参照してください: MySQL-条件付き外部キー制約
可能になるはずです。潜在的な問題の1つは、3つの外部キー制約の名前が同じであることです。
いいえ、1つの外部キーフィールドは1つのテーブルを参照するためのものです。
説明したとおりにFK制約があった場合、item_idフィールドは3つのテーブルすべてで同じ主キー値を参照します。 3つの異なるテーブルの目的の主キーが異なる主キーを持つ可能性が非常に高くなります。
必要なのは、1つのレコード(行)がProduct、Header、およびServiceテーブルのレコードを参照することです。その方法は、外部キーごとに1つずつ、3つの異なるフィールドを使用することです。
また、Itemテーブルにはつの外部キーが必要です。 PDFテーブルにはItemを参照するフィールドが1つあり、Itemのレコードは他の3つのテーブルを参照しています。
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$$
理論的には、単一の列に複数の外部キーを強制することはできません。または、複数のテーブルに存在する入力を検証し、必要な操作を実行する手順を使用してこれを実施できます。その特定のテーブルでのすべての操作は、必要な条件を検証するプロシージャによって実行される必要があることに注意してください。
はい、可能です。少し奇妙に思えても。
最初に、MySQL Workbenchのスクリーンショットを表示して、動作することを証明したいと思います。
...そして、「変更を適用するのを忘れたかもしれません」と言う人のために...スキーマブラウザのスクリーンショットを次に示します。
そして最後に、いくつかのサンプルデータを含むエクスポートされたダンプ:
-- MySQL dump 10.13 Distrib 5.7.12, for Win64 (x86_64)
--
-- Host: localhost Database: multiple_foreign_keys
-- ------------------------------------------------------
-- Server version 5.7.17-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `header`
--
DROP TABLE IF EXISTS `header`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `header` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`desc` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `header`
--
LOCK TABLES `header` WRITE;
/*!40000 ALTER TABLE `header` DISABLE KEYS */;
INSERT INTO `header` VALUES (42,'Header','Test Header');
/*!40000 ALTER TABLE `header` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `pdf_created`
--
DROP TABLE IF EXISTS `pdf_created`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `pdf_created` (
`id` int(10) unsigned NOT NULL 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`),
UNIQUE KEY `id` (`id`),
KEY `fk_item_to_product_idx` (`item_id`),
CONSTRAINT `fk_item_to_header` FOREIGN KEY (`item_id`) REFERENCES `header` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_item_to_product` FOREIGN KEY (`item_id`) REFERENCES `product` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_item_to_service` FOREIGN KEY (`item_id`) REFERENCES `service` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `pdf_created`
--
LOCK TABLES `pdf_created` WRITE;
/*!40000 ALTER TABLE `pdf_created` DISABLE KEYS */;
INSERT INTO `pdf_created` VALUES (1,2,5,42,1);
/*!40000 ALTER TABLE `pdf_created` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `product`
--
DROP TABLE IF EXISTS `product`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `product` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`category_id` int(3) unsigned NOT NULL,
`symbol` varchar(255) DEFAULT NULL,
`desc` varchar(255) DEFAULT NULL,
`price` decimal(5,2) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `product`
--
LOCK TABLES `product` WRITE;
/*!40000 ALTER TABLE `product` DISABLE KEYS */;
INSERT INTO `product` VALUES (42,13,'product','desc',10.00);
/*!40000 ALTER TABLE `product` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `service`
--
DROP TABLE IF EXISTS `service`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `service` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`desc` varchar(255) NOT NULL,
`price` decimal(5,2) NOT NULL,
`active` int(1) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `service`
--
LOCK TABLES `service` WRITE;
/*!40000 ALTER TABLE `service` DISABLE KEYS */;
INSERT INTO `service` VALUES (42,'some service',5.00,1);
/*!40000 ALTER TABLE `service` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2018-08-27 10:31:41
SQLスクリプトエディターの代わりにテストする場合は、MySQL Workbenchで「データのインポート/復元」を使用します。
[〜#〜] but [〜#〜]product
、header
およびservice
テーブルはpdf_created.item_id
によって参照されます。3つすべてが同じIDを取得するのは幸運な偶然だからです。 id(アイテムのid)を割り当てる必要があります。