Mysql 创建数据表及其约束条件(可选)

Mysql创建数据表

数据库创建成功后可在该数据库中创建数据表(简称为表)存储数据。请注意:在操作数据表之前应使用“USE 数据库名;”指定操作是在哪个数据库中进行先关操作,否则会抛出“No database selected”错误。

语法如下:

 create table 表名(
         字段1 字段类型[(宽度) 约束条件],
         字段2 字段类型[(宽度) 约束条件],
         …
         字段n 字段类型[(宽度) 约束条件],
);

常见的约束条件:

primary key (PK)      #标识该字段为该表的主键,可以唯一的标识记录,主键就是不为空且唯一当然其还有加速查询的作用
foreign key (FK)      #标识该字段为该表的外键,用来建立表与表的关联关系

not null              #标识该字段不能为空
default               #为该字段设置默认值

unique key (UK)       #标识该字段的值是唯一的
auto_increment        #标识该字段的值自动增长(整数类型,而且为主键)

unsigned              #将整型设置为无符号即正数
zerofill              #不够使用0进行填充
创建数据表及其带约束条件的创建数据表

示例:创建学生表 MySQL命令:

 create table student(
 id int,
 name varchar(20),
 gender varchar(10),
 birthday date
 );
2.1.1 null 与 default

带有not null 与 default 约束条件的创建数据库表:

create table t1(
    id int primary key auto_increment,                #指定id为主键即不为空且唯一,并将其设置为自动增长
    name varchar(16) not null,                        #将名字设置为varchar类型,并将约束条件设置为不为空
    sex enum('male','female') not null default 'male' #将名字设置为枚举类型即多选一,并将约束条件设置为不为空且设置默认值,如果我们不传名字则以默认的名字进行传入
);
2.1.2 unique 应用

带有 unique 约束条件的创建数据库表:

create table t2(x int unique);         #将字段x这只为唯一,也就是说不能插入的值不能重复喽
create table t3(
    x int,
    y varchar(5),
    unique key(x)                     #换汤不换药,只是换了件衣服,变换一种形式告诉你,原来设置字段唯一还可以这用,呵呵并没有什么卵用
);

'''---------------------------------------------------------------------------------'''
create table t4(
    x int,
    y varchar(5),
    constraint uni_x unique key(x)   #将字段x设置为唯一,并为该键起一个别名,起名字这事也没啥用
);

'''---------------------------------------------------------------------------------'''
create table service(
    ip varchar(15),
    port int,
    unique key(ip,port)              #联合主键,也就是说当你插入一条记录不能与之前插入的记录两个同时不能一样,有一个重复是也是可以正常插入滴
);
插入一条记录给你看看吧
mysql> insert into service values
    -> ('1.1.1.1',3306),
    -> ('1.1.1.1',3306);           #看到了吧我插入两条一样的记录,就是不让我插,哼!
ERROR 1062 (23000): Duplicate entry '1.1.1.1-3306' for key 'ip'
2.1.3 primary key 应用

primary key字段的值不为空且唯一

(一)带有 primary key 约束条件的创建数据库表:(单列做主键)

============单列做主键===============
#方法一:not null + unique
create table department1(
id int not null unique, # 主键
name varchar(20) not null unique,
comment varchar(100)
);

mysql> desc department1;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | NO   | PRI | NULL    |       |
| name    | varchar(20)  | NO   | UNI | NULL    |       |
| comment | varchar(100) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
rows in set (0.01 sec)

# 方法二:在某一个字段后用primary key
create table department2(
id int primary key, #主键
name varchar(20),
comment varchar(100)
);

mysql> desc department2;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | NO   | PRI | NULL    |       |
| name    | varchar(20)  | YES  |     | NULL    |       |
| comment | varchar(100) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
rows in set (0.00 sec)

# 方法三:在所有字段后单独定义primary key
create table department3(
id int,
name varchar(20),
comment varchar(100),
constraint pk_name primary key(id)  #创建主键并为其命名pk_name
);

mysql> desc department3;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | NO   | PRI | NULL    |       |
| name    | varchar(20)  | YES  |     | NULL    |       |
| comment | varchar(100) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
rows in set (0.01 sec)

(二)带有 primary key 约束条件的创建数据库表:(多列做主键)

==================多列做主键================
create table service(
ip varchar(15),
port char(5),
service_name varchar(10) not null,
primary key(ip,port)
);

mysql> desc service;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ip           | varchar(15) | NO   | PRI | NULL    |       |
| port         | char(5)     | NO   | PRI | NULL    |       |
| service_name | varchar(10) | NO   |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
rows in set (0.00 sec)

mysql> insert into service values
    -> ('172.16.45.10','3306','mysqld'),
    -> ('172.16.45.11','3306','mariadb')
    -> ;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into service values ('172.16.45.10','3306','nginx');
ERROR 1062 (23000): Duplicate entry '172.16.45.10-3306' for key 'PRIMARY'
2.1.4 foreign key应用

一个表中有外键字段

#1、约束1:有了foreign key在创建表时,----必须先建被关联的表dep,才能建关联表emp
create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);   #要先创建被关联的表,因为关联的表中有被关联表的id,否则先创建关联的表,此时

被关联的字段通常是一个key,
create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)  #自己表中的dep_id关联到dep中的id
);

#2、约束2:在插入记录时,必须先插被关联的表dep,才能插关联表emp
insert into dep(dep_name,dep_comment) values
('sb教学部','sb辅导学生学习,教授python课程'),
('外交部','老男孩上海校区驻张江形象大使'),
('nb技术部','nb技术能力有限部门');


insert into emp(name,gender,dep_id)  values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);

删除是则子相反,删除则是关联的表优先,有限成为被删除的对象

#3、约束3:更新与删除都需要考虑到关联与被关联的关系
解决方案:
1、先删除关联表emp,再删除被关联表dep,准备重建
mysql> drop table emp;
Query OK, 0 rows affected (0.11 sec)

mysql> drop table dep;
Query OK, 0 rows affected (0.04 sec)


2、重建:新增功能,同步更新,同步删除
create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);

create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)
    on update cascade               #更新同步
    on delete cascade               #删除同步
);
insert into dep(dep_name,dep_comment) values
('sb教学部','sb辅导学生学习,教授python课程'),
('外交部','老男孩上海校区驻张江形象大使'),
('nb技术部','nb技术能力有限部门');


insert into emp(name,gender,dep_id)  values
('alex','male',1),
('egon','male',2),
('lxx','male',1),
('wxx','male',1),
('wenzhou','female',3);

# 同步删除
mysql> select * from dep;
+----+------------------+------------------------------------------------------------------------------------------+
| id | dep_name         | dep_comment                                                                              |
+----+------------------+------------------------------------------------------------------------------------------+
|  1 | sb教学部         | sb辅导学生学习,教授python课程                                                           |
|  2 | 外交部           | 老男孩上海校区驻张江形象大使                                                             |
|  3 | nb技术部         | nb技术能力有限部门                                                                       |
+----+------------------+------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

mysql> select * from emp;
+----+------------------+--------+--------+
| id | name             | gender | dep_id |
+----+------------------+--------+--------+
|  1 | alex             | male   |      1 |
|  2 | egon             | male   |      2 |
|  3 | lxx              | male   |      1 |
|  4 | wxx              | male   |      1 |
|  5 | wenzhou          | female |      3 |
+----+------------------+--------+--------+
5 rows in set (0.00 sec)

mysql> delete from dep where id=1;
Query OK, 1 row affected (0.02 sec)

mysql> select * from dep;
+----+------------------+------------------------------------------------------------------------------------------+
| id | dep_name         | dep_comment                                                                              |
+----+------------------+------------------------------------------------------------------------------------------+
|  2 | 外交部           | 老男孩上海校区驻张江形象大使                                                             |
|  3 | nb技术部         | nb技术能力有限部门                                                                       |
+----+------------------+------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select * from emp;
+----+------------------+--------+--------+
| id | name             | gender | dep_id |
+----+------------------+--------+--------+
|  2 | egon             | male   |      2 |
|  5 | wenzhou          | female |      3 |
+----+------------------+--------+--------+
2 rows in set (0.00 sec)

#同步更新
mysql> select * from emp;
+----+------------------+--------+--------+
| id | name             | gender | dep_id |
+----+------------------+--------+--------+
|  2 | egon             | male   |      2 |
|  5 | wenzhou          | female |      3 |
+----+------------------+--------+--------+
2 rows in set (0.00 sec)

mysql> update dep set id=200 where id =2;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from dep;
+-----+------------------+------------------------------------------------------------------------------------------+
| id  | dep_name         | dep_comment                                                                              |
+-----+------------------+------------------------------------------------------------------------------------------+
|   3 | nb技术部         | nb技术能力有限部门                                                                       |
| 200 | 外交部           | 老男孩上海校区驻张江形象大使                                                             |
+-----+------------------+------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select * from emp;
+----+------------------+--------+--------+
| id | name             | gender | dep_id |
+----+------------------+--------+--------+
|  2 | egon             | male   |    200 |
|  5 | wenzhou          | female |      3 |
+----+------------------+--------+--------+
2 rows in set (0.00 sec)

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,我们可以使用外键关系和约束来创建数据表之间的关系。下面是关于MySQL关系和约束的简要说明: 1. 外键关系:一个表的外键是另一个表的主键或唯一键。通过创建外键关系,我们可以在数据表之间建立引用关系。外键可以确保数据完整性,并提供了相关数据的关联和一致性。 2. 主键约束:主键是一个唯一且非空的标识符,用于标识表中的每一条记录。我们可以通过指定某个字段为主键,确保每条记录都具有唯一的标识,并且不能是空值。 3. 唯一约束:唯一约束确保一个表中指定列的值是唯一的,即没有重复值。当我们在某个字段上创建唯一约束后,该字段的值不能重复,并且可以为NULL(如果允许)。 4. 非空约束:非空约束确保一个表中指定列的值不为空。在创建非空约束后,该字段的值不能为NULL。 5. 默认约束:默认约束可指定某个字段的默认值,当插入新记录时,如果该字段未设置值,则会使用默认值。 6. 检查约束:检查约束进行条件检查,以确保特定的有效数据范围。我们可以在某个字段上指定检查条件,以限制允许的值。如果不满足条件,将无法插入或更新表中的数据。 通过使用这些关系和约束,我们可以在MySQL创建高效和可靠的数据表之间的关系。这些关系和约束能够确保数据的一致性、完整性和正确性,以及帮助我们更好地组织和管理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值