从0到1学数据库:表和约束

本文介绍了如何在MySQL中创建、修改表结构,包括创建表、重命名、添加/删除列、修改数据类型,以及数据完整性约束的设置。还探讨了约束的类型和使用,以及表的删除、重命名和截断操作,是数据库初学者的重要参考资料。
摘要由CSDN通过智能技术生成

点击上方“罗晓胜”,马上关注,您的支持对我帮助很大

上期文章

 

 

 

/   前言   /

 

前面我们都是学习怎么操作数据,下面我们学习怎么去操作表,对表结构进行增删改查。

 

/   正文   /

 

本章要点

• 创建表
• 修改表
• 删除表
• 重命名
• 截断表
• 数据完整性约束

数据库对象命名原则

• 数据库对象命名原则 – 必须由字母开始,长度在 1–30个字符之间。– 名字中只能包含 A–Z, a–z, 0–9, _ (下划线),$ 和 #。– 同一个数据库服务器用户所拥有的对象名字不能重复。– 名字不能为数据库的保留字。– 名字是大小写不敏感

注:详情可参考本项目-mysql开发规范

建表语句语法

• 建表语法 CREATE TABLE [schema.]table (column datatype [DEFAULT expr][, ...]);

用子查询语法创建表

• 使用子查询创建表的语法

CREATE TABLE table[(column, column...)] AS subquery;

• 新表的字段列表必须与子查询中的字段列表匹配 • 字段列表可以省略

CREATE TABLE student2 AS SELECT id, name, age+10 newAge FROM student WHERE id = 1;

• Select列表中的表达式列需要给定别名,如果没有别名会产生错误

表的分类

MySQL 数据表主要支持六种类型 ,分别是:BDB、HEAP、ISAM、MERGE、MYISAM、InnoBDB。

  • 事务安全型(transaction-safe):

    • BDB:Mysql最早的具有事务能力的表的类型,目前已经停止开发

    • InnoDB:在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

  • 非事务安全型(non-transaction-safe):

    • HEAP:是MySQL表中访问最快的表,将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问(注意,这种类型下数据是非持久化设计的,它一般适应于临时表,如果MySQL或者服务器崩溃,表中数据全部丢失。)

    • ISAM:是MyISAM类型出现之前MySQL表使用的默认类型,现在已经被MyISAM代替。

    • MERGE:由一组MyISAM表组成,之所合并主要出于性能上考虑,因为它能够提高搜索速度,提高修复效率,节省磁盘空 间

    • MYISAM:基于ISAM类型,但它增加了许多有用的扩展,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一

数据类型与列定义

数值类型

类型大小范围(有符号)范围(无符号)用途
TINYINT1 byte(-128,127)(0,255) 
SMALLINT2 bytes(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 bytes (-8 388 608,8 388 607)(0,16 777 215)大整数值 
INT或INTEGER4 bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度、浮点数值
DOUBLE8 bytes(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度、浮点数值
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值依赖于M和D的值

日期和时间类型:表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型大小范围(有符号)范围(无符号)用途
DATE3 1000-01-01/9999-12-31YYYY-MM-DD日期值 
TIME3 '-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间 
YEAR1 1901/2155YYYY年份值 
DATETIME8 1000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值 
TIMESTAMP4 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳 

字符串类型:字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型大小用途
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

修改表的定义

  1. 修改表名 ALTER table tablename rename to newtablename;

  2. 添加列语法:ALTER TABLE table ADD (columnname datatype[DEFAULT expr] [, columnname datatype]...);

  3. 修改列语法:ALTER TABLE table MODIFY(columnname datatype[DEFAULT expr] [, columnname datatype]...);

  4. 删除列语法:ALTER TABLE table DROP (columnname [,columnname]);

示例:

-- 修改表名
ALTER table student rename to newstudent;
-- 添加列
ALTER TABLE student ADD column c_weight int(5) not null comment '体重' AFTER `age`; //在哪个字段后面添加
-- 修改列
ALTER TABLE student MODIFY c_weight varchar(20) COMMENT '体重';
-- 删除列
ALTER TABLE student DROP c_weight;

添加新列

ALTER TABLE table ADD (columnname datatype[DEFAULT expr] [, columnname datatype]...);

• 增加列原则:– 可以添加或修改列 – 可指定新添加列的位置,使用AFTER 字段

修改已存在的列

• 列的修改可以修改数据类型,长度,及默认值。• 修改数据类型:已有的行数据必须为空。• 修改长度原则:数值型修改长度:当长度向小改时,已有行的数该列必须为空;当长度向大改时,可以随意修改。字符型修改长度:当长度向小改时,只要修改后的值能容纳下 当前已有数据的最大值即可,当长度向大改时,可以随意修改。• 修改列的默认值:

-默认值的修改不会影响已经存在的行,只影响新增加的行

• 把student表年龄(age) 列,修改为长度为2 ALTER TABLE student MODIFY age CHAR(2);

• 添加默认值 ALTER TABLE student MODIFY age DEFAULT ‘1’;

删除列

• 可以用DROP子句从表中删除列,包括列的定义和数据。• 删除列原则:

– 列可以有也可以没有数据。– 表中至少保留一列。– 列被删除后,不能再恢复。– 被外键引用的列,不能被删除。

• 删除列语法一 ALTER TABLE emp student COLUMN age;

• 删除列语法二 ALTER TABLE table student (columnname[,columnname]);

• 删除student表的两个字段“name”和“age”。ALTER TABLE student DROP (name,age);

删除、重命名与截断表

删除表

• 删除表语法:

DROP TABLE table;

– 只有表的创建者 – 或具有DROP ANY TABLE权限的用户才能删除表

• 删除表原则:– 表中所有的数据和结构都被删除。– 任何视图和同义词被保留但无效。– 所有与其相关的约束和索引被删除。– 任何未完成的事务被提交。

示例 DROP TABLE student;

重命名表

• 重命名语句语法:alter table RENAME old_name TO new_name; – 必须是对象的所有者

• 把emp表重新命名为empl alter table test_a rename to sys_app;

截断表

• 截断表语法:TRUNCATE TABLE table;

– 执行TRUNCATE语句的前提,必须是表的所有者 – 或者有DELETE ANY TABLE系统权限来截断表。

示例:TRUNCATE TABLE emp;

备注:清空表和截断表的区别 清空表:delete from users;清空表只是清空表中的逻辑数据,但是物理数据不清除,如主键值、索引等不被清除,还是原来的值。

截断表:truncate table users;截断表可以用于删除表中 的所有数据。截断表命令还会回收所有索引的分配页

约束的概念

• 约束 (constraints) 是防止无效数据输入到表中。约束做下面的事:– 多个表之间的具体关系,比如两个表之间的主外键关系。– 表在插入、更新行或者删除行的时候强制表中的数据遵循 约束规则。– 对于成功的操作,约束条件是必须被满足的。– 如果表之间有依赖关系,使用约束可以防止表或表中相关 数据的删除。

• 约束命名 – 约束命名原则:所有的约束定义存储在数据字典中。– 如果给约束一个有意义的名字,约束易于维护,约束命名 必须遵守标准的对象命名规则。– 如果没有给约束命名,Oracle服务器将用默认格式 SYS_Cn产生一个名字,这里 n 是一个唯一的整数,来保 证名称的唯一性。– 建议至少应该给表的主、外键按照命名原则来命名,如可 以采用这样的原则来命名,表名_字段名_约束类型。

约束的类型

约束说明
NOT NULL指定列不能包含空值
DEFAULT默认值,用于保证该字段有默认值。
UNIQUE指定列的值或者列的组合的值对于表中所有的行必须 是唯一的
PRIMARY KEY表的每行的唯一性标识
FOREIGN KEY在列和引用表的一个列建立并且强制的列之间关系
CHECK指定一个必须为真的条件

生成与维护约束

• 约束的语法如下:CREATE TABLE [schema.] table (column datatype [ DEFAULT expr][column_constraint], ...[table_constraint][,...]);

– 约束可以在两个级别上定义,表级约束与列级约束。– 列级约束能够定义完整性约束的任何类型。– 表级约束除了NOT NULL之外,能够定义完整性约束的任 何类型。

示例

create table if not exists t_stuinfo(
     id int primary key,    #主键
     stuName varchar(20) not null,    #非空
     gender char(1) check(gender='男' or gender='女'),    #检查约束,MySql没有效果但不报错
     seat int unique,    #唯一约束
     age int default 18,    #默认(值)约束
     majorId int references major(id) #外键约束,MySql没有效果,但不报错
     );

现有表中增加/删除约束

• 增加约束语法如下:ALTER TABLE table ADD [CONSTRAINT constraint] type (column);

• 删除约束语法 Alter TABLE tablename Drop Primary key | Unique (column)| Constraint constraint [Cascade]

示例:

-- 添加非空约束
alter table 表名称 modify column 列名 列类型 not null;
-- 添加默认约束
alter table 表名称 modify column 列名 列类型 default 默认值;
-- 添加主键
alter table 表名称 modify column 列名 列类型 primary key;
alter table 表名称 add primary key(id);

-- 删除默认约束
alter table 表名称 modify column 列名 列类型;
-- 删除主键
Alter table student modify column id int;;
Alter table student drop primary key;
-- 删除唯一
alter table 表名称 drop index(索引名) 设置唯一时的名称;

约束的启用和禁用

• 禁用约束 – 如果有大批量数据导入时,我们可以采用禁用约束的方法, 主要的好处,首先效率高,另外有主外键约束的表之间导 入时,不用考虑导入的先后顺序。

• 禁用外键约束语法:SET FOREIGN_KEY_CHECKS=0;

• 启用约束语法:SET FOREIGN_KEY_CHECKS=1;

 

/   总结   /

 

本文主要讲了如何修改表结构等信息,在表创建有问题或者需要拓展时,可以参考文中的操作方法。

 

往期推荐:

如何入门做软件开发

为什么我不推荐入行程序员

做全栈开发很难吗

关注我的公众号,学习技术或投稿

图片

长按上图,识别图中二维码即可关注

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值