数据表的约束及数据类型操作

数据表的约束

非空 NOT NULL

唯一 UNIQUE KEY 可以多个

主键 PRIMARY KEY 一张表只有一个

自增长 AUTO_INCREMENT 必须和主键一起使用

默认值 DEFAULT

### mysql数据库

#### 知识要点:

1. 表结构操作
2. 非空约束
3. 唯一约束
4. 主键约束
5. 自增长
6. 默认约束
7. 外键约束

### 表结构的操作

`ALTER TABLE ‘tbname‘`

增加 :ADD
删除 :DROP
修改 :MODIFY #改列的数据类型

? CHANGE #改列名和数据类型

? RENAME #改表名

```mysql
#ADD
mysql> ALTER TABLE `tb1`
-> ADD (`age` INT,
-> `number` INT);

#DROP
mysql> ALTER TABLE `tb1`
-> DROP `number`;

#MODIFY
mysql> ALTER TABLE `tb1`
-> MODIFY `age` VARCHAR(4);

#CHANGE
mysql> ALTER TABLE `tb1`
-> CHANGE `age` `ages` INT;

#RENAME
mysql> ALTER TABLE `tb1` RENAME `tb2`;

#表名和字段名,尽量避免修改,即便是在封装得很好的情况下也要修改代码,如果是上线的东西就更加不要修改
```

### 非空约束

`NULL` 字段值可以为空

`NOT NULL` 字段值不能为空

```mysql
例:
mysql> CREATE TABLE `tb11`(
-> `id` INT,
-> `name` VARCHAR(20)
-> );
Query OK, 0 rows affected (0.11 sec)

mysql> DESC `tb11`;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> INSERT INTO `tb11`
-> VALUES(1,‘aa‘),
-> (2,‘bb‘);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> INSERT INTO `tb11`(`id`)
-> VALUES(3);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM `tb11`;
+------+------+
| id | name |
+------+------+
| 1 | aa |
| 2 | bb |
| 3 | NULL |
+------+------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE `tb11`
-> MODIFY `name` VARCHAR(20) NOT NULL;
ERROR 1138 (22004): Invalid use of NULL value
mysql> DELETE FROM `tb11`
-> WHERE `name` is NULL
-> ;
Query OK, 1 row affected (0.00 sec)

mysql> ALTER TABLE `tb11`
-> MODIFY `name` VARCHAR(20) NOT NULL;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql>
```

### 唯一约束

确保字段中的值的唯一`unique key`

```
添加唯一约束
ALTER TABLE tbl_name ADD [CONSTRAINT[symbol]]
UNIQUE [INDEX|KEY] [index_name] [index_type]
(index_col_name)

删除唯一约束
ALTERT TABLE tbl_name DROP {INDEX|KEY} index_name
```

```mysql
例:
mysql> SELECT * FROM `tb11`;
+------+------+
| id | name |
+------+------+
| 1 | aa |
| 2 | bb |
+------+------+
2 rows in set (0.00 sec)
mysql> INSERT INTO `tb11`
-> VALUES(2,‘cc‘)
-> ;
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM `tb11`;
+------+------+
| id | name |
+------+------+
| 1 | aa |
| 2 | bb |
| 2 | cc |
+------+------+
3 rows in set (0.00 sec)

mysql> CREATE TABLE `tb2`(
-> `id` INT UNIQUE KEY,
-> `name` VARCHAR(20) NOT NULL
-> );

mysql> ALTER TABLE `tb2`
-> MODIFY `id` INT NOT NULL UNIQUE KEY,
-> ADD UNIQUE KEY(`name`)
-> ;
```

### 主键约束

主键保证记录的唯一性
主键自动为`NOT NULL`
每张数据表只能存在一个主键
`NOT NULL + UNIQUE KEY`

一个`UNIQUE KEY` 又是一个`NOT NULL`的时候,那么它被当做`PRIMARY KEY `主键
当一张表里没有一个主键的时候,第一个出现的非空且为唯一的列被视为有主键。

```
添加主键约束
ALTER TABLE tbl_name ADD [CONSTRAINT[sysbol]]
PRIMARY KEY [index_type] (index_col_name)

删除主键约束
ALTER TABLE tbl_name DROP PRIMARY KEY
```

```mysql
例:
mysql> CREATE TABLE `tb3`(
-> `id` INT PRIMARY KEY,
-> `name` VARCHAR(20) NOT NULL UNIQUE KEY
-> );
mysql> ALTER TABLE `tb3`
-> DROP PRIMARY KEY
-> ;
mysql> ALTER TABLE `tb3`
-> DROP KEY `name`
-> ;
```

### 自增长`AUTO_INCREMENT `

`AUTO_INCREMENT` 自动编号,且必须与主键组合使用
默认情况下,起始值为1,每次的增量为1。
当插入记录时,如果为`AUTO_INCREMENT`数据列明确指定了一个数值,则会出现两种情况,

情况一,如果插入的值与已有的编号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;

情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。

```mysql
例:
mysql> INSERT INTO `tb3`(`name`)
-> VALUES(‘aa‘),
-> (‘bb‘)
-> ;
mysql> INSERT INTO `tb3`(`name`,`id`)
-> VALUES (‘cc‘,2);
ERROR 1062 (23000): Duplicate entry ‘2‘ for key ‘PRIMARY‘
mysql> INSERT INTO `tb3`(`name`,`id`)
-> VALUES (‘cc‘,5);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `tb3`(`name`)
-> VALUES (‘dd‘)
-> ;
```

### 默认约束`DEFAULT `

`DEFAULT `(默认约束)
初始值设置,插入记录时,如果没有明确为字段赋值,则自动赋予默认值。

```
添加/删除默认约束
ALTER TABLE tbl_name ALTER [COLUMN] col_name
{SET DEFAULT literal | DROP DEFAULT}
```

```mysql
例:
mysql> CREATE TABLE `tb4`(
-> `id` INT PRIMARY KEY AUTO_INCREMENT,
-> `name` VARCHAR(20) NOT NULL
-> )AUTO_INCREMENT=10
-> ;
mysql> INSERT INTO `tb4`(`name`)
-> VALUES(‘aa‘),
-> (‘bb‘)
-> ;
mysql> ALTER TABLE `tb4`
-> ADD `age` INT NOT NULL DEFAULT 18
-> ;
mysql> ALTER TABLE `tb4`
-> ALTER `name` SET DEFAULT ‘xx‘
-> ;

```

### 外键约束`FOREING KEY `

```mysql
外键约束要求数据表的存储引擎只能为InnoDB

查看当前mysql服务器支持的存储引擎
SHOW ENGINES \G

编辑数据表的默认存储引擎

MySQL配置文件 ->/etc/my.cnf

[mysqld]
default-storage-engine=INNODB

改完配置文件要重启服务

sudo service mysqld restart
```

```mysql
例:
mysql> CREATE TABLE `department`(
-> `d_id` INT PRIMARY KEY AUTO_INCREMENT,
-> `name` VARCHAR(20) NOT NULL
-> );
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE `students`(
-> `s_id` INT PRIMARY KEY AUTO_INCREMENT,
-> `name` VARCHAR(20) NOT NULL,
-> `dept_id` INT,
-> FOREIGN KEY(`dept_id`) REFERENCES `department`(`d_id`)
-> );
Query OK, 0 rows affected (0.02 sec)

mysql>
```

原文地址:https://www.cnblogs.com/bytree/p/9431755.html

时间: 2024-10-10 22:56:32

数据表的约束及数据类型操作的相关文章

SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC)的GIS专业理论知识. 5.其他相关知识. 通过前面几篇文章介绍了

使用SQL语句向已有数据表添加约束

如果向存在数据的表里添加约束,有可能会出现数据不符合检查约束而造成添加约束失败. 如: 这是一个表,为身份证号添加检查约束. USE DEmo--指向当前操作的数据库 GO ALTER TABLE Employee ADD CONSTRALNT CK_EmployeeID CHECK(LEN(EmployeeID=18) 然后会出现 报错意思是数据表里面的身份证号现有数据有不等于18的,与检查约束冲突,会添加失败. 用ALTER  TABLE Employee+ WITH NOCHECK可以解决

修改数据表——添加约束

比如,原来数据表根本就没有约束,或者说,约束不够.那么如何来添加约束呢? 添加约束 1.添加主键约束(只能一个) 2.添加唯一约束(可以多个) 3.添加外键约束() 4.添加默认约束() 现在,先创建 create table user2( username varchaer(10) not null , pid smallint unsigned ); show columns from user2; alter table user2 add id smallint unsigned ; s

第7讲++创建数据表和约束

二.创建数据表 1.创建简单的数据表 --命令格式 --create table 表名 -- (列定义 列约束 [,--n]) --实例1:在xscj库中,创建一个简单的表xsqk. create table xscj.dbo. xsqk (学号 char (10), 姓名 varchar (10), 性别 bit , 联系电话 char(11) ) 实例2:在xscj库中,创建"序号"标识属性."学号"非空属性,"性别"有默认值1的表xsqk.

多用户操作一个数据表时的并发性操作

事务处理(多用户同时操作一条信息时是用-并发) 在c/s或多层中,如果两个用户同时打开一条记录,修改后提交会产生更新冲突: 据说办法有二:1.打开同时锁定表的记录 2.浦获错误,撤消其中一个用户的修改,但是很少见到具体实现的代码:请大家告诉具体的代码怎么写: 1.打开时如何锁定一条记录? 2.如何扑获更新错误?在delphi中调试时会报“该记录读出后已经被再次修改”,而在运行时如何判定错误为更新冲突?因为更新时其他的错误如输入不合法等也可能报错,如何把更新冲突和其他的分开? ==========

第8讲++数据表和约束的创建(实训)

动手操作1:创建kc表和表约束(续) create database xscj go --表示一个批的结束.go 只能独自占用一行 use xscj --从默认的master数据库切换到xscj库 create table kc ( 序号 int identity, 课程号 char (3) not null primary key , 课程名 varchar (20) not null , 授课教师 varchar (20) , 开课学期 tinyint not null default 1

19 MySQL概念 数据库 数据表 数据类型 增加删除修改查询 WHERE Order By Limit

数据库管理系统DBMS 数据库中相关概念 数据库 数据表 记录 字段 数据 登录和退出MySQL客户端 查询自己的MySQL服务器有几个数据库 二.退出MySQL客户端的命令 修改root用户的密码 在MySQL客户端来修改密码(当前账号的密码) 数据库操作 创建数据库 显示所有数据库 删除数据库 选择数据库 更改数据库默认字符集 数据表操作 显示当前数据库中的所有表 创建数据表 显示表的创建 列的常用属性 修改数据表 删除数据表 显示表结构 MySQL数据类型 整型 浮点型 字符型 文本型 日

约束以及修改数据表

先创建一个数据表 再创建一张数据表,让其属性pid参照上一个provinces数据表的id 主要代码为:FOREIGN KEY (pid) REFERENCES provinces(id) 查看province以及users的表索引,就可以看到两个约束,一个是主键id另一个就是pid 接下来了解外键约束的参照操作 CASCAD:从父表删除或更新且自动删除或更新子表中匹配的行 SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL.如果使用该选项,必须保证子表列没有指定NOT NUL

SQL Server 的数据表简单操作

--创建数据表--[use 要创建数据表的数据库名称go]create table 要创建的表名(字段名 数据类型[长度] [null | not null] [primary key],... ... ... ... ,字段名 数据类型[长度] [null | not null]) 例:use 商品管理数据库gocreate table 客户信息表(客户编号 nchar(8) not null,客户姓名 nvarchar(5) not null,联系电话 nvarchar(11) not nu