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

nvbavucw  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(420)

我指的是冬眠时的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级别实现,而不是由数据库强制实现?或者我的眼睛错过了什么?

dxpyg8gm

dxpyg8gm1#

实际上,可以在sql中定义1:1的关系。有两种方法:
子表与父表具有相同的主键,具有相同的值。此列也是父表的fk。
子表的主键不同。它还有一个指向父表的fk,这个fk有一个唯一的约束。
如果您注意到,在这两种情况下,fk都是唯一的(它是pk,或者有一个唯一的约束),这是关键的方面。不可能在子表中创建具有相同父表的第二行。
你的问题中包含的案例选择了策略1。

相关问题