数据库——主外键实例

要求:
每个表的主外键 
客户的姓名不能为空值
邮箱不能重复
客户的性别(男,女)

商品goods(商品编号goods_ id,商品名goods_ name, 单价unitprice, 商品类别category,  供应商provider) 
create table goods(
goods_id tinyint primary key auto_increment ,
goos_name varchar(100) not null default ' ',
unitprice decimal (10,2) not null default 0,
category smallint not null default 0,
provider varchar(30) not null default ' '
);
 desc goods;
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| goods_id  | int(10) unsigned | NO   | PRI | NULL    |       |
| goos_name | varchar(100)     | NO   |     |         |       |
| unitprice | decimal(10,2)    | NO   |     | 0.00    |       |
| category  | smallint(6)      | NO   |     | 0       |       |
| provider  | varchar(30)      | NO   |     |         |       |
+-----------+------------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

客户customer(客户号customer_ id,姓名name,住址address,邮箱email,性别sex,身份证card_id) 
create table customer(
customer_id int unsigned primary key auto_increment,
name varchar(100) not null default ' ',
address varchar(100) not null default ' ',
email varchar(30) not null unique,
sex char(2) not null default '男',
card_id varchar(20) not null unique
);

 desc custome;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| customer_id | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name        | varchar(100)     | NO   |     |         |                |
| address     | varchar(100)     | NO   |     |         |                |
| email       | varchar(30)      | NO   | UNI | NULL    |                |
| sex         | char(2)          | NO   |     | 男      |                |
| card_id     | varchar(20)      | NO   | UNI | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
6 rows in set (0.08 sec)

购买purchase(购买订单号order_ id,客户号customer_ id,商品号goods_ id,购买数量nums)
create table purchase(
order_id varchar(30) not null primary key,
customer_id int unsigned,
goods_id int unsigned,
num int not null default 0,
foreign key(customer_id) references customer(customer_id),
foreign key(goods_id) references goods(goods_id)
);
desc purchase;
+-------------+------------------+------+-----+---------+-------+
| Field       | Type             | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+-------+
| order_id    | varchar(30)      | NO   | PRI | NULL    |       |
| customer_id | int(10) unsigned | YES  | MUL | NULL    |       |
| goods_id    | int(10) unsigned | YES  | MUL | NULL    |       |
| num         | int(11)          | NO   |     | 0       |       |
+-------------+------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
 

### 数据库中的 #### 的概念及用途 是一种用于唯一标识表中每一行记录的机制。它由一个或一组字段组成,其值在整个表范围内必须是唯一的,并且不允许为空[^1]。通过定义,可以确保在执行数据更新或删除操作时不会发生误操作,从而提高数据的一致性和可靠性。 还可以与其他表中的配合使用,形成参照完整性约束,进一步增强数据库结构的安全性[^1]。如果现有字段无法满足作为的要求,则可以选择使用 `Uniqueidentifier` 类型生成全局唯一标识符 (GUID),以便于跨多个数据库实例间的数据同步和复制[^2]。 #### 的概念及用途 是用来建立两个表之间的关联关系的一种方法。具体来说,它是子表中的某个字段,该字段指向父表中的或者某一候选。这样做的目的是为了维护两表间的逻辑一致性——即当一条记录被插入到子表之前,必须先验证所引用的对象已经在父表存在;同样地,在尝试修改或移除任何涉及这种依赖关系的信息前也需要遵循相应的规则以保护整体架构不受破坏。 #### 的区别 - **功能不同**: 要用于保证本表内部每条记录的独特身份, 而则是实现跨表连接的重要工具. - **数量差异**: 每张表格仅允许设置单一; 反之则可能包含零个乃至若干个定义. - **可空性规定**: 构成的部分绝不应留白(即NULL), 然而某些情况下允许取值缺失. #### 的联系 两者共同构建起复杂信息系统内的实体间相互制约体系—借助恰当配置好的/部关字组合, 不但能有效减少冗余存储需求量, 还有助于预防潜在的操作失误引发的数据紊乱状况出现. 此, 它们也是实施规范化处理过程里不可或缺的基础组件之一[^1]. ```sql -- 创建具有的示例表 CREATE TABLE Department ( DeptID INT PRIMARY KEY, Name VARCHAR(50) NOT NULL ); CREATE TABLE Employee ( EmpID INT PRIMARY KEY, Name VARCHAR(50) NOT NULL, Salary DECIMAL(8, 2), DeptID INT, FOREIGN KEY (DeptID) REFERENCES Department(DeptID) ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值