mysql - MySQL 一对多和一对一的关系是如何定义的?
问题描述
我无法理解如何在 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;
如果眼睛没问题,我看不出两者有什么区别。是否像这种关系基数约束仅在休眠级别实现而不由数据库强制执行?还是我的眼睛漏掉了什么?
解决方案
实际上可以在 SQL 中定义 1:1 关系。有两种方法:
子表与父表具有相同的 PK,具有相同的值。此列也是父表的 FK。
子表有不同的PK。它还有一个指向父表的 FK,并且这个 FK 有一个 UNIQUE 约束。
如果您注意到,在这两种情况下,FK 都是唯一的(它是 PK,或者具有 UNIQUE 约束),这是关键方面。不可能在具有相同父级的子表中创建第二行。
您在问题中包含的案例选择了策略#1。
推荐阅读
- php - 使用 .htaccess 删除 .php 扩展名会重复我的页面吗?
- ios - 如何使用 UITableView 在列表中创建列表
- python - 将列表从 pandas 列附加到 python 列表
- c# - Xamarin Android 将小部件工具栏图标向右对齐
- django - Django filter queryset __in exact matching
- python - 数据框列 str 替换为列表
- latex - 未在 toc 中的参考文献后的附录和缺少图形标签
- ios - 在 Swift 4 中使用 KeyEnumerators
- javascript - 我可以将 DOM 节点从 iFrame 移动到父母的正文吗?
- python - NameError:名称“click_entry”未定义(Python)