MySQL---约束(主键约束,自增长约束,非空约束,唯一约束,默认约束、零填充约束)

1. 主键约束

MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中

尽快的找到某一行。

主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。

每个表最多只允许一个主键

主键约束的关键字是:primary key

当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

1.1 添加单列主键:

-- 方式1:在 create table 语句中,通过 PRIMARY KEY 关键字来指定主键。
-- 在定义字段的同时指定主键,语法格式如下:
-- create table 表名(
--   ...
--   <字段名> <数据类型> primary key 
--   ...
-- )

create table emp1(
    eid int primay key,
    name VARCHAR(20),
    deptId int,
    salary double
);
-- 方式2:在定义字段之后再指定主键,语法格式如下:
-- create table 表名(
--   ...
--   [constraint <约束名>] primary key [字段名]
-- );

create table emp2(
    eid INT,
    name VARCHAR(20),
    deptId INT,
    salary double,
    constraint  pk1 primary key(id)
 );

1.2 联合主键(多列主键):

所谓的联合主键,就是这个主键是由一张表中多个字段组成的

注意:

   1. 当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。

   2. 一张表只能有一个主键,联合主键也是一个主键

-- 语法:
-- create table 表名(
--
--   ...
--
--   primary key (字段1,字段2,…,字段n)
--
--);

create table emp3( 
  name varchar(20), 
  deptId int, 
  salary double, 
  primary key(name,deptId) 
);

1.3 修改表结构时添加主键

<think>嗯,用户让我在数据库中创一个学生student,需要满足一些约束条件。首先,我得理清楚每个字段的数据类型约束要求。让我先看看用户的具体要求: 学号作为主键,姓名字段,性别有检查约束只能是男或女,班级默认值是“软件131”,ID自增长。 首先,学号通常用整数或者字符串,但主键的话可能需要唯一且。比如,学号可能用varchar,因为有时候会有字母,但用户没有特别说明,可能用整数也行。不过主键一般用整数比较高效,但如果有特殊格式可能需要varchar。这里用户没有说明,我可能需要假设学号为整数类型,比如INT。 姓名字段,所以需要NOT NULL约束。性别字段要检查只能是男或女,所以需要用CHECK约束,比如CHECK (gender IN ('男', '女'))。班级默认值设置为“软件131”,所以DEFAULT '软件131'。ID自增长,这通常是用AUTO_INCREMENT在MySQL里,或者IDENTITY在SQL Server,或者其他数据库的自增方式。用户没有指定数据库类型,可能需要用通用的方法,但通常示例会用MySQL的语法,所以用AUTO_INCREMENT。 接下来,数据类型的选择。学号作为主键,如果用INT的话,长度可能不够,比如学号可能比较长,比如10位数字的话,INT最大是4字节,最多到2147483647,可能不够,所以用BIGINT或者VARCHAR。但用户可能希望用数字类型,但不确定。或者可能学号是字符串类型,比如包含年份序列号。这里可能需要根据实际情况判断,但如果没有说明,可能用INT也可以,或者更保险的用VARCHAR(20)来容纳各种学号格式。 姓名字段用VARCHAR,长度比如50,足够中文姓名。性别用VARCHAR(1)或者CHAR(1),但检查约束的话,用CHAR(1)可能更合适,存储'男'或'女'。不过有些数据库可能需要用VARCHAR,比如MySQL的CHECK可能允许。班级字段同样用VARCHAR,比如VARCHAR(50)默认值“软件131”。 ID字段自增长,所以用INT AUTO_INCREMENT,并且作为主键?但是用户要求学号为主键,所以ID是自增长但可能不是主键。这时候需要注意,用户可能希望学号是主键,而ID是另一个自增长字段,可能作为代理键。或者可能用户有混淆,需要确认。根据用户描述,“学号字段设置为主键”,而“ID字段设置自增长”,所以ID是一个独立的字段,自增长,但主键是学号。因此,结构里会有学号(主键)、ID(自增长)、姓名、性别、班级等字段。 那正确的SQL语句应该是: CREATE TABLE student ( ID INT PRIMARY KEY AUTO_INCREMENT, 这里有问题,因为用户说学号是主键,所以ID应该是自增长但不是主键。可能用户希望学号是主键,而ID是另一个自增长的列,但主键只能有一个,除是复合主键。但用户可能希望学号作为主键,而ID作为自增长主键字段。但通常自增长的字段会被设为主键,这里可能存在矛盾。需要仔细看用户需求。 用户明确说:“学号字段设置为主键”,而“ID字段设置自增长”。所以学号是主键,ID是另一个自增长的字段,但主键只能有一个,所以ID只是自增长,不是主键。这在某些数据库中,比如MySQL自增长字段必须是主键或至少是索引的一部分,否则可能无法使用AUTO_INCREMENT。例如,在MySQL中,每个只能有一个AUTO_INCREMENT列,并且该列必须被定义为键(主键或唯一键)。所以如果学号是主键,那么ID如果要自增长,可能需要是唯一键,但用户可能希望ID只是普通列自增长,这可能有问题。 这可能意味着用户的需求存在矛盾,或者在设计结构时需要调整。比如,可能用户希望学号是主键,而ID作为自增长的代理主键,但这样会有两个主键,这是不可能的。或者用户可能将ID作为自增长的列,而学号作为主键,这时候在MySQL中,ID无法使用AUTO_INCREMENT,除它是主键或唯一键。因此,这里可能存在用户需求的不一致,需要进一步确认,但根据问题描述,用户可能希望学号是主键,而ID是另一个自增长的列,但需要处理数据库的限制。 例如,在MySQL中,如果ID要自增长,必须定义为键,所以可能需要将其设为唯一键,但用户可能没有这个要求。这可能意味着用户的需求在特定数据库系统中可能无法完全实现,或者需要调整。 或者,用户可能混淆了自增长主键的概念,可能实际上希望学号是主键,而ID作为另一个自增长的唯一标识符,但需要处理数据库的限制。这时候可能需要根据具体的数据库系统来处理。例如,在MySQL中,可以这样写: CREATE TABLE student ( 学号 VARCHAR(20) PRIMARY KEY, 姓名 VARCHAR(50) NOT NULL, 性别 CHAR(1) CHECK (性别 IN ('男', '女')), 班级 VARCHAR(50) DEFAULT '软件131', ID INT AUTO_INCREMENT, UNIQUE (ID) ); 这样,ID是自增长,并且有唯一约束,但主键是学号。这样在MySQL中是允许的,因为AUTO_INCREMENT列需要是索引的一部分,这里通过UNIQUE约束实现。 但用户可能没有提到ID需要是唯一或键,所以可能需要解释这一点,或者在示例中处理这种情况。 不过,根据用户给出的要求,可能需要给出一个在常见数据库(如MySQL)中可行的解决方案,即使需要添加UNIQUE约束到ID字段,因为这是数据库的要求。 总结结构: - 学号:主键,VARCHAR或INT - 姓名:VARCHAR, - 性别:CHAR(1)或VARCHAR(1),检查约束 - 班级:VARCHAR,默认- ID:INT自增长,需设置为UNIQUE或KEY 现在,编写具体的SQL语句: 在MySQL中: CREATE TABLE student ( 学号 VARCHAR(20) PRIMARY KEY, 姓名 VARCHAR(50) NOT NULL, 性别 CHAR(1) CHECK (性别 IN ('男', '女')), 班级 VARCHAR(50) DEFAULT '软件131', ID INT AUTO_INCREMENT, UNIQUE (ID) ); 但这样,ID是自增长且有唯一约束,而学号是主键。这可能满足用户需求,但需要确认是否允许。 或者,如果用户希望ID仅仅是自增长而不需要唯一约束,这在MySQL中是不可能的,因为AUTO_INCREMENT必须与键关联。因此,可能需要调整,或者用户可能接受ID作为唯一键。 另外,检查约束MySQL默认是不强制执行的,除启用了CHECK约束的支持(MySQL 8.0之后支持,但需要验证)。例如,在MySQL 8.0之前,CHECK约束会被忽略,所以可能需要使用ENUM类型来约束性别字段。 所以,可能更可靠的做法是将性别字段定义为ENUM('男', '女'),这样即使CHECK约束不被支持,也能限制输入值。 同样,对于班级的默认值,直接使用DEFAULT '软件131'即可。 因此,针对MySQL的可能语句: CREATE TABLE student ( 学号 VARCHAR(20) PRIMARY KEY, 姓名 VARCHAR(50) NOT NULL, 性别 ENUM('男', '女'), 班级 VARCHAR(50) DEFAULT '软件131', ID INT AUTO_INCREMENT UNIQUE ); 这里,性别用ENUM类型来确保只能是男或女,ID设置为自增长并唯一,满足MySQL的要求。学号为主键,姓名为NOT NULL,班级有默认值。 但用户可能明确要求使用检查约束,而不是ENUM,所以可能需要用CHECK,尽管在旧版本MySQL中可能无效。如果用户使用的是支持CHECK约束数据库版本,那么可以保留CHECK。 例如: CREATE TABLE student ( 学号 VARCHAR(20) PRIMARY KEY, 姓名 VARCHAR(50) NOT NULL, 性别 CHAR(1) CHECK (性别 IN ('男', '女')), 班级 VARCHAR(50) DEFAULT '软件131', ID INT AUTO_INCREMENT UNIQUE ); 在MySQL 8.0中,CHECK约束会被强制执行,因此这样是可行的。 另外,学号的数据类型可能需要根据实际情况选择,比如VARCHAR(20)可以容纳较长的学号,而INT可能不够,如果学号包含字母或其他字符,就必须用VARCHAR。 综上,最终的SQL语句可能如下: CREATE TABLE student ( 学号 VARCHAR(20) PRIMARY KEY, 姓名 VARCHAR(50) NOT NULL, 性别 CHAR(1) CHECK (性别 IN ('男', '女')), 班级 VARCHAR(50) DEFAULT '软件131', ID INT AUTO_INCREMENT UNIQUE ); 但需要解释各个部分,以及可能的数据库差异。 此外,如果用户使用的是SQL Server,自增长是IDENTITY(1,1),而检查约束的写法可能略有不同,但用户没有指定数据库类型,所以可能需要给出通用的示例,或者以MySQL为例。 总结,我需要给出一个符合用户要求的语句,并解释每个约束的实现方式,同时指出可能的数据库差异或注意事项。</think>以下是创学生`student`的步骤及详细说明: --- ### **1. 设计结构及字段说明** | 字段名 | 数据类型 | 约束说明 | |--------|---------------|--------------------------| | 学号 | `VARCHAR(20)` | 主键 | | 姓名 | `VARCHAR(50)` | 约束 | | 性别 | `CHAR(1)` | 检查约束(只能输入男女) | | 班级 | `VARCHAR(50)` | 默认约束(软件131) | | ID | `INT` | 自增长 | --- ### **2. 创SQL语句** ```sql CREATE TABLE student ( 学号 VARCHAR(20) PRIMARY KEY, 姓名 VARCHAR(50) NOT NULL, 性别 CHAR(1) CHECK (性别 IN ('男', '女')), 班级 VARCHAR(50) DEFAULT '软件131', ID INT AUTO_INCREMENT UNIQUE ); ``` --- ### **3. 关键约束解释** 1. **主键约束** - `学号` 是唯一标识学生的字段,通过 `PRIMARY KEY` 设置为主键,确保且唯一。 2. **约束** - `姓名` 字段必须填写,通过 `NOT NULL` 强制要求用户输入。 3. **检查约束** - `性别` 字段只能输入 `男` 或 `女`,通过 `CHECK (性别 IN ('男', '女'))` 实现数据有效性验证。 4. **默认约束** - 若未指定班级,则自动填充默认值 `软件131`,通过 `DEFAULT '软件131'` 实现。 5. **自增长字段** - `ID` 字段通过 `AUTO_INCREMENT` 实现自动递增(需配合 `UNIQUE` 约束确保唯一性,某些数据库MySQL要求自增字段必须是主键或唯一键)。 --- ### **4. 注意事项** - **数据库兼容性** - 自增长语法因数据库不同可能变化(如SQL Server用 `IDENTITY(1,1)`,PostgreSQL用 `SERIAL`)。 - **检查约束的生效性** - 部分旧版本数据库(如MySQL 5.7及以下)默认忽略 `CHECK` 约束,可通过触发器替代实现。 - **学号的数据类型** - 若学号包含字母或特殊字符(如`S2023001`),需使用 `VARCHAR`;若纯数字且长度较大,可用 `BIGINT`。 --- ### **5. 示例数据插入** ```sql -- 插入数据(班级使用默认值) INSERT INTO student (学号, 姓名, 性别) VALUES ('2023001', '张三', '男'); -- 插入数据(显式指定班级) INSERT INTO student (学号, 姓名, 性别, 班级) VALUES ('2023002', '李四', '女', '软件132'); ``` --- 通过上述步骤,即可创一个符合要求的学生,确保数据的完整性有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三月七꧁ ꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值