하나의 열을 여러 개의 외부 키로 참조할 수 있습니까?
테이블이 거의 없고 PDF 테이블의 한 열을 여러 개의 다른 테이블로 참조하고 싶습니다.
예를 들어 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;
그것을 만드는 것이 가능합니까?
아니요.
즉, 이러한 방식으로 외부 키 제약 조건을 만들 수 없습니다.그러나 외부 키 제약 조건 없이 외부 키를 사용할 수 있습니다.
외부 키는 조인에 사용할 수 있는 다른 테이블(또는 동일한 테이블의 다른 레코드) 기본 키의 값입니다.조인 값만 사용하면 기본 키 이외의 필드를 참조할 수 있습니다.
그러나 외부 키 제약 조건은 테이블의 모든 외부 키 값에 대해 참조된 테이블이 기본 키인 레코드를 갖는다는 규칙을 적용하도록 데이터베이스에 알려줍니다.PDF 테이블의 모든 외래 키가 네 개의 테이블 모두에 기본 키를 포함하도록 강제하는 것은 효과가 없습니다.따라서 필드를 사용하여 다른 레코드를 참조하되 외부 키 제약 조건을 만들지 마십시오.
당신이 만난 문제는 전화입니다.Polymorphic Associations
다음 질문을 참조하십시오.MySQL - 조건부 외부 키 제약 조건
가능할 겁니다.한 가지 잠재적인 문제는 세 개의 외부 키 제약 조건이 동일한 이름을 가지고 있다는 것입니다.
아니요, 하나의 외부 키 필드는 하나의 테이블을 참조하는 것입니다.
설명한 대로 FK 제약 조건이 있는 경우 item_id 필드는 세 테이블 모두에서 동일한 기본 키 값을 참조합니다.세 개의 서로 다른 테이블에 있는 원하는 기본 키의 기본 키가 서로 다를 가능성이 매우 높습니다.
원하는 것은 하나의 레코드(행)가 Product, Header 및 Service 테이블의 레코드를 참조하는 것입니다.이렇게 하는 방법은 각 외래 키에 대해 하나씩 세 개의 다른 필드를 사용하는 것입니다.
또한 Item 테이블에 필요한 세 개의 외부 키가 있다는 것도 알게 되었습니다.PDF 테이블에는 항목을 참조하는 필드가 하나 있고 항목의 레코드는 다른 세 개의 테이블을 참조합니다.
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에서 '데이터 가져오기/복원'을 사용합니다.
그러나 자동 증분을 사용해서는 안 됩니다.product
,header
그리고.service
에서 참조하는 테이블pdf_created.item_id
왜냐하면 세 사람 모두가 같은 아이디를 갖게 된다면 행운의 우연이 될 것이기 때문입니다.ID(항목의 ID)를 할당해야 합니다.
예. 가능합니다. 하나의 열을 여러 테이블의 외부 키로 사용할 수 있지만, 이러한 유형의 메서드를 사용해야 하는 곳에 이렇게 많이 의존하지는 않지만, 목적에 맞게 이러한 유형의 SQL 쿼리를 사용할 수 있기 때문에 이 작업을 수행하는 것이 좋습니다.)
ALTERdemo4
제약 조건 추가rel1
외부 키(two
) 참조demo1
(id
) 업데이트 제한에 대한 삭제 제한 시;
ALTERdemo4
제약 조건 추가rel2
외부 키(two
) 참조demo2
(id
) 업데이트 제한에 대한 삭제 제한 시;
ALTERdemo4
제약 조건 추가rel3
외부 키(two
) 참조demo3
(id
) 업데이트 제한에 대한 삭제 제한 시;
언급URL : https://stackoverflow.com/questions/15547276/is-it-possible-to-reference-one-column-as-multiple-foreign-keys
'programing' 카테고리의 다른 글
AVAssetWriter/AVAssetReader를 사용하여 비디오 프레임률을 설정하는 중 문제 발생 (0) | 2023.09.03 |
---|---|
Android Studio에서 서명된 APK를 생성하는 동안 서명 버전 - V1(Jar Signature)과 V2(Full APK Signature)의 차이점은 무엇입니까? (0) | 2023.09.03 |
MySQL에서 중복 레코드만 선택하여 표시 (0) | 2023.09.03 |
SSL 연결은 mysql 클라이언트에서는 작동하지만 Perl DBI에서는 작동하지 않습니다.마리아DB (0) | 2023.09.03 |
문자열에 제로 패딩 추가 (0) | 2023.09.03 |