gpt4 book ai didi

mysql - MySQL一对多和一对一关系是如何定义的?

转载 作者:行者123 更新时间:2023-11-30 21:38:00 24 4
gpt4 key购买 nike

我指的是 Hibernate tuts:1 , 2 .

我无法理解如何在 MySQL 表中定义一对一和一对多关系。

这是一对多关系的SQL:

CREATE TABLE `Cart` (
`cart_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`total` decimal(10,0) NOT NULL,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`cart_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `Items` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`cart_id` int(11) unsigned NOT NULL,
`item_id` varchar(10) NOT NULL,
`item_total` decimal(10,0) NOT NULL,
`quantity` int(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `cart_id` (`cart_id`),
CONSTRAINT `items_ibfk_1` FOREIGN KEY (`cart_id`) REFERENCES `Cart` (`cart_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

这是一对一关系的 SQL:

-- Create Transaction Table
CREATE TABLE `Transaction` (
`txn_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`txn_date` date NOT NULL,
`txn_total` decimal(10,0) NOT NULL,
PRIMARY KEY (`txn_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

-- Create Customer table
CREATE TABLE `Customer` (
`txn_id` int(11) unsigned NOT NULL,
`cust_name` varchar(20) NOT NULL DEFAULT '',
`cust_email` varchar(20) DEFAULT NULL,
`cust_address` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`txn_id`),
CONSTRAINT `customer_ibfk_1` FOREIGN KEY (`txn_id`) REFERENCES `Transaction` (`txn_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

如果眼睛没问题,我看不出两者之间有什么区别。这种关系基数约束是否只在 hibernate 级别实现,而不是由数据库强制执行?还是我的眼睛漏了什么?

最佳答案

实际上可以在 SQL 中定义 1:1 关系。有两种方式:

  1. 子表与父表具有相同的 PK,具有相同的值。此列也是父表的 FK。

  2. 子表有不同的 PK。它还有一个指向父表的FK,这个FK有一个UNIQUE约束。

如果您注意到,在这两种情况下,FK 都是 UNIQUE(它是 PK,或者具有 UNIQUE 约束),这是关键方面。不可能在具有相同父级的子表中创建第二行。

您在问题中包含的案例选择了策略 #1。

关于mysql - MySQL一对多和一对一关系是如何定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53015878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com