澳门在线威尼斯官方 > 电脑数据库 > 开发不得不注意的坑

原标题:开发不得不注意的坑

浏览次数:128 时间:2019-09-29

目前,将线上MySQL数据库晋级到了5.7。思考到恐怕产生的不包容性,在提高在此之前,确实也是胆颤心惊,固然测量试验意况,开辟条件早在八个月前就已提前进级。

SQL语句分类:

听别人说先前时代的实验斟酌和爱侣的反馈,与支出相关的首要性有两点:

1.DDL DATA define LANGUAGE 数据定义语句: CREATE    ALTEENCORE ;

sql_mode

2.DML DATA manipulation LANGUAGE 数据操作语句  增加和删除改语句  INSERT /  DELETE /UPDATE ;

MySQL 5.6中,其暗中同意值为"NO_ENGINE_SU BSTITUTION",可领略为非严加形式,举个例子,对自增主键插入空字符串'',即便提示warning,但并不影响自增主键的变型。

3.DQL DATA QUE奥迪Q5Y LANGUAGE  数据查询语句  SELECT ;

但在MySQL 5.7中,其就调动为了严俊方式,对于地点那个,其不会唤起warning,而是一贯报错。

一、增删改

分组求最值

1.增加 INSERT

分组求最值的有些写法在MySQL5.7中得不到预期结果,那一点,相对来讲比较蒙蔽。

方式1:

 

语法:INSERT INTO 表名 (字段1,字段2。。。) VALUES(值1,值2。。。);

里头,第一点是可控的,终归能够调动参数。而第二点,却是不可控的,没有参数与之巢毁卵破,须求开支Review代码。

mysql> INSERT INTO emp (empno,ename,deptno) VALUES(1,'tom',1010);

 

格局2:插入部分字段的值,字段的个数和顺序要与值的个数和顺序一致

上面具体来会见

测量检验数据

mysql> select * from emp;
+-------+----------+--------+--------+
| empno | ename    | sal    | deptno |
+-------+----------+--------+--------+
|  1001 | emp_1001 | 100.00 |     10 |
|  1002 | emp_1002 | 200.00 |     10 |
|  1003 | emp_1003 | 300.00 |     20 |
|  1004 | emp_1004 | 400.00 |     20 |
|  1005 | emp_1005 | 500.00 |     30 |
|  1006 | emp_1006 | 600.00 |     30 |
+-------+----------+--------+--------+
6 rows in set (0.00 sec)

其间,empno是员工编号,ename是员工姓名,sal是薪水,deptno是职工所在单位号。

 

政工的须求是,求出各类单位四川中华南理工科业余大学学学程集团资最高的职工的相关音讯。

在MySQL5.6中,我们可以透过上边那么些SQL来完结,

SELECT
    deptno,ename,sal 
FROM
    ( SELECT * FROM emp ORDER BY sal DESC ) t 
GROUP BY
    deptno;

 

结果如下,能够看见,其确实达成了预想效应。

+--------+----------+--------+
| deptno | ename    | sal    |
+--------+----------+--------+
|     10 | emp_1002 | 200.00 |
|     20 | emp_1004 | 400.00 |
|     30 | emp_1006 | 600.00 |
+--------+----------+--------+

 

再来看看MySQL5.7的结果,竟然不雷同。

+--------+----------+--------+
| deptno | ename    | sal    |
+--------+----------+--------+
|     10 | emp_1001 | 100.00 |
|     20 | emp_1003 | 300.00 |
|     30 | emp_1005 | 500.00 |
+--------+----------+--------+

 

实际上,在MySQL5.7中,对该SQL进行了改写,改写后的SQL可通过explain(extended)

  • show warnings查看。

    mysql> explain select deptno,ename,sal from (select * from emp order by sal desc) t group by deptno; +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-----------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-----------------+ | 1 | SIMPLE | emp | NULL | ALL | NULL | NULL | NULL | NULL | 6 | 100.00 | Using temporary | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-----------------+ 1 row in set, 1 warning (0.00 sec)

    mysql> show warningsG *** 1. row ***

    Level: Note
     Code: 1003
    

    Message: / select#1 / select slowtech.emp.deptno AS deptno,slowtech.emp.ename AS ename,slowtech.emp.sal AS sal from slowtech.emp group by slowtech.emp.deptno 1 row in set (0.00 sec)

 

从改写后的SQL来看,其免除了子查询,导致结果不能够贯彻预期效应,官方也注解了那或多或少,

 

洋英国人想必不以为然,以为没人会这么写,但在如雷贯耳的stackoverflow中,该兑现的点赞数就有117个-同理可得其受众之广,稍低于后边提到的“方法二”(点赞数206个)。 

 

亟需小心的是,该SQL在5.7中是不可能一贯运转的,其会提醒如下错误:

ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 't.ename' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

 

这个与sql_mode有关,在MySQL 5.7中,sql_mode调治为了

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

其中,ONLY_FULL_GROUP_BY与group by语句关于,其须要select列表里只可以出现分组列(即group by前边的列)和聚合函数(sum,avg,max等),那也是SQL92的标准。

 

但在工作中,却常常看看开采访编写出上面这种SQL。

mysql> select deptno,ename,max(sal) from emp group by deptno;
+--------+----------+----------+
| deptno | ename    | max(sal) |
+--------+----------+----------+
|     10 | emp_1001 |   200.00 |
|     20 | emp_1003 |   400.00 |
|     30 | emp_1005 |   600.00 |
+--------+----------+----------+
3 rows in set (0.01 sec)

 实在不晓得,这里的ename在事情层有啥意义,究竟,他并不是薪给最高的那位职员和工人。

 

mysql> INSERT INTO emp (empno,ename) VALUES(2,'tom');

分组求最值,MySQL的落到实处际情状势

骨子里分组求最值是三个很宽泛的急需。在专业中,也平时被开垦同事问到。 上面具体来拜访,MySQL中有啥样完成格局。

方法1

SELECT
    e.deptno,
    ename,
    sal 
FROM
    emp e,
    ( SELECT deptno, max( sal ) maxsal FROM emp GROUP BY deptno ) t 
WHERE
    e.deptno = t.deptno 
    AND e.sal = t.maxsal;

 

方法2

SELECT
    a.deptno,
    a.ename,
    a.sal 
FROM
    emp a
    LEFT JOIN emp b ON a.deptno = b.deptno 
    AND a.sal < b.sal 
WHERE
    b.sal IS NULL;

 那二种实现格局,其实是通用的,不唯有适用于MySQL,也适用于其余主流关系型数据库。

 

方法3
MySQL 8.0生产精通析函数,其也可落成类似成效。

SELECT
    deptno,
    ename,
    sal 
FROM
    (
    SELECT
        deptno,
        ename,
        sal,
        LAST_VALUE ( sal ) OVER ( PARTITION BY deptno ORDER BY sal ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) maxsal 
    FROM
        emp 
    ) a 
WHERE
    sal = maxsal;

 

艺术3:省略字段,可是值的个数和种种要和表里的等同;

两种达成格局的质量相比较

因下面测量检验案例的数据量太小,两种达成方式的结果都是秒出,仅凭施行计划很难直观地观察完毕格局的上下。

下边换上数据量更加大的测验数据,官方示例数据库employees中的dept_emp表,

表的有关音信如下,当中emp_no是职员和工人编号,dept_no是机构编号,from_date是入职日期。

mysql> show create table dept_empG
*************************** 1. row ***************************
       Table: dept_emp
Create Table: CREATE TABLE `dept_emp` (
  `emp_no` int(11) NOT NULL,
  `dept_no` char(4) NOT NULL,
  `from_date` date NOT NULL,
  `to_date` date NOT NULL,
  KEY `dept_no` (`dept_no`,`from_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> select count(*) from dept_emp;
+----------+
| count(*) |
+----------+
|   331603 |
+----------+
1 row in set (0.09 sec)

mysql> select * from dept_emp limit 1;
+--------+---------+------------+------------+
| emp_no | dept_no | from_date  | to_date    |
+--------+---------+------------+------------+
|  10001 | d005    | 1986-06-26 | 9999-01-01 |
+--------+---------+------------+------------+
1 row in set (0.00 sec)

 

方法1

mysql> select d.dept_no,d.emp_no,d.from_date from dept_emp d, (select dept_no,max(from_date) max_hiredate from dept_emp group by dept_no) t where d.dept_no=t.dept_no and d.from_date=t.max_hiredate;
…
12 rows in set (0.00 sec)

mysql> explain select d.dept_no,d.emp_no,d.from_date from dept_emp d, (select dept_no,max(from_date) max_hiredate from dept_emp group by dept_no) t where d.dept_no=t.dept_no and d.from_date=t.max_hiredate;
+----+-------------+------------+------------+-------+---------------+---------+---------+--------------------------+------+----------+----------------------
| id | select_type | table      | partitions | type  | possible_keys | key     | key_len | ref                      | rows | filtered | Extra                
+----+-------------+------------+------------+-------+---------------+---------+---------+--------------------------+------+----------+----------------------
|  1 | PRIMARY     | <derived2> | NULL       | ALL   | NULL          | NULL    | NULL    | NULL                     |    9 |   100.00 | Using where          
|  1 | PRIMARY     | d          | NULL       | ref   | dept_no       | dept_no | 19      | t.dept_no,t.max_hiredate |    5 |   100.00 | NULL                 
|  2 | DERIVED     | dept_emp   | NULL       | range | dept_no       | dept_no | 16      | NULL                     |    9 |   100.00 | Using index for group-by
+----+-------------+------------+------------+-------+---------------+---------+---------+--------------------------+------+----------+----------------------

 

方法2

mysql> explain select a.dept_no,a.emp_no,a.from_date from dept_emp a left join dept_emp b on a.dept_no=b.dept_no and a.from_date < b.from_date where b.from_date is null;
+----+-------------+-------+------------+------+---------------+---------+---------+--------------------+--------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key     | key_len | ref                | rows   | filtered | Extra                    |
+----+-------------+-------+------------+------+---------------+---------+---------+--------------------+--------+----------+--------------------------+
|  1 | SIMPLE      | a     | NULL       | ALL  | NULL          | NULL    | NULL    | NULL               | 331008 |   100.00 | NULL                     |
|  1 | SIMPLE      | b     | NULL       | ref  | dept_no       | dept_no | 16      | slowtech.a.dept_no |  41376 |    19.00 | Using where; Using index |
+----+-------------+-------+------------+------+---------------+---------+---------+--------------------+--------+----------+--------------------------+
2 rows in set, 1 warning (0.00 sec)

 

方法3

mysql> select dept_no,emp_no,from_date from ( select dept_no,emp_no,from_date,last_value(from_date) over(partition by dept_no order by from_date rows between unbounded preceding and unbounded following) max_hiredate from dept_emp) a where from_date=max_hiredate;
…
12 rows in set (1.57 sec)

mysql> desc select dept_no,emp_no,from_date from ( select dept_no,emp_no,from_date,last_value(from_date) over(partition by dept_no order by from_date rows between unbounded preceding and unbounded following) max_hiredate from dept_emp) a where from_date=max_hiredate;
+----+-------------+------------+------------+------+---------------+------+---------+------+--------+----------+----------------+
| id | select_type | table      | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra          |
+----+-------------+------------+------------+------+---------------+------+---------+------+--------+----------+----------------+
|  1 | PRIMARY     | <derived2> | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 331008 |   100.00 | Using where    |
|  2 | DERIVED     | dept_emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 331008 |   100.00 | Using filesort |
+----+-------------+------------+------------+------+---------------+------+---------+------+--------+----------+----------------+
2 rows in set, 2 warnings (0.00 sec)

 

从实行时间上看,

主意1的年华最短,在有复合索引(deptno, fromdate)的动静下,结果弹指间就出来了,纵然在未曾索引的气象下,也只消耗了0.75s。

措施2的时刻最长,3个小时照旧没出结果。同样的数码,同样的SQL,放到Oracle查,也消耗了87分49秒。

措施3的小运比较一定,无论是还是不是存在索引,都保持在1.5s左右,比办法1的耗时要久。

此处,对前边提到的,MySQL 5.7中不再包容的贯彻情势也做了个测量检验,在未曾另外索引的情事下,其安居在0.7s(品质并不弱,怪不得有人利用),而同等情状下,方法1牢固在0.5s(哈,MySQL 5.6竟是比8.0还快)。但与方法1不一致的是,其不能通过索引进行优化。

 

从实践布置上看,

办法1, 先将group by的结果放到一时表中,然后再将该一时表作为驱动表,来和dept_emp表举行关联合检查询。驱动表小(唯有9条记下),关联列又有目录,无怪乎,结果能秒出。

方法2, 两表关联。其犯了SQL优化中的多个禁忌。

   1. 使得表太大,其有331603条记下。

   2. 被驱动表纵然也许有目录,但从进行布署上看,其只利用了复合索引  (dept_no, from_date)中的dept_no,而dept_no的选拔率又太低,终归唯有9个机构。

主意3, 先把深入分析的结果放到二个临时表中,然后再对该有时表进行处理。其开展了三遍全表扫描,二遍是对准dept_emp表,二回是指向有的时候表。

 

之所以,对于分组求最值的须求,建议采取方法1,其不独有适合SQL标准,查询质量上也是最好的,特别是在共同索引的动静下。

 

PS:

经大神指导,对在此之前涉嫌的,MySQL 5.7中不再包容的兑现形式,实际能够透过调解optimizer_switch来加以规避

set optimizer_switch='derived_merge=off';

derived_merge是MySQL 5.7引进的,其会计算将Derived Table(派生表,from前面包车型客车子查询),视图援用,公用表表明式(Common table expressions)与外层查询进行统一。如,

SELECT *
  FROM t1 JOIN (SELECT t2.f1 FROM t2) AS derived_t2
          ON t1.f2=derived_t2.f1
  WHERE t1.f1 > 0;

改写为

SELECT *
 FROM t1 JOIN (SELECT DISTINCT f1 FROM t2) AS derived_t2
         ON t1.f1=derived_t2.f1;

 

mysql> INSERT INTO emp VALUES (3,'bob',1002);

2.删除 DELETE

办法1:删除表中的全体数据;

语法:DELETE FROM  表名;

mysql> DELETE FROM emp;

艺术2:删除符合条件的数码;

语法: DELETE FROM 表名 WHERE 条件;

mysql> DELETE FROM emp WHERE ename ='tom';

操作符:

=等于

<小于

<=小于等于

>大于

>=大于等于

<>不等于  !=

BETWEEN 下限值 AND  上线值

留意:下限值和上线值是归纳的。

如:mysql> DELETE FROM emp  WHERE empno BETWEEN 2 AND 4;  包含2和4;

逻辑表明式:

连续大家的基准表达式的

AND  而且  全数的标准都要满意的景况下才会去相配。

mysql> DELETE FROM emp WHERE empno>=2 AND empno<=4;

O索罗德 或然    满意在那之中之一的尺度都能相配。

mysql> DELETE FROM emp WHERE empno=1 OR empno =5;

3.更新数据UPDATE

不带条件能够变动全部字段的值:

mysql> UPDATE emp SET deptno =1001;

带条件,改换切合条件的数据:

mysql> UPDATE emp SET deptno =1002 WHERE ename='tom';

变动八个字段的值

mysql> UPDATE emp SET empno=5,deptno=1003 WHERE ename ='tom';

/*二、轻巧询问DQL (data query language)

1.查询全体列的具有数据;

使用*的频率相对相当的低,

select * from 表名;

select sid,sname ,birthday from 表名;

2.查询钦赐列的多少;

select 字段1,字段2.。。。from  表名;

3.去重查询

SELECT DISTINCT sname FROM student;

4.列企图:数值列能够开展加减乘除运算

SELECT sid,sname ,sal+comm  FROM student;

5.字段的外号 ,as可以简轻巧单,外号的引号能够简轻巧单

SELECT sid AS 编号,sname AS 姓名,birthday AS 生日 FROM student;

6.法规查询

SELECT * FROM student WHERE birthday >'2000-02-01'AND sex='女' OR sid=1 ;

in关键词:

字段的值符合括号里的任何三个就满足条件

SELECT * FROM student WHERE sid IN(1,4,9);

SELECT * FROM student WHERE sname IN('tom','bob') ;

not in: 不是括号里的此外二个就满意条件

is null :值为null;

is not null:值不为null;

7.模糊查询  like

%  代表擅自多少个字符

_  代表四个字符

select * from student where sname like '张';

select * from student where sname like '___张';

8.排序  order by

asc :ascend 升序,默以为升序;

desc : descend 降序;

select * from student order by sal asc;

按多个字段排序:

语法: select * from 表名 order by 字段1 desc ,字段2  desc;

select * from student order by sex desc ,sal  desc;

9.limit 限量重回的条数  常常用于数据分页

limit m,n;  m代表最初的目录,n代表个数;

SELECT * FROM emp LIMIT 15,5;

limit n;  n代表个数,索引从0起先;

  1. null和别的值计算都得null;

函数:ifnull(字段,值); 若该字段中有值为null;

SELECT ename ,sal+IFNULL(comm,0) FROM emp;

函数:concat(字段,值或字段);能够把字段的值拼接起来;

SELECT ename ,CONCAT(sal,'元') sal FROM emp;

*/

1.创办学生表student:学生编号sid 主键自拉长,姓名sname 非空,性别sex  非空,生日birthday ,年龄age ,班级编号cid ;

mysql> create table student(sid int primary key auto_increment,sname varchar(10)

not null,sex varchar(10) not null,birthday date,age int,cid int);

Query OK, 0 rows affected (0.03 sec)

那是学生表student:

+----------+-------------+------+-----+---------+----------------+

| Field    | Type        | Null | Key | Default | Extra          |

+----------+-------------+------+-----+---------+----------------+

| sid      | int(11)    | NO  | PRI | NULL    | auto_increment |

| sname    | varchar(10) | NO  |    |        |                |

| sex      | varchar(10) | NO  |    |        |                |

| birthday | date        | YES  |    | NULL    |                |

| age      | int(11)    | YES  |    | NULL    |                |

| cid      | int(11)    | YES  |    | NULL    |                |

+----------+-------------+------+-----+---------+----------------+

2.成立班级表class: 班级编号 cid 主键 ,班级名称cname 非空;

mysql> create table class(cid int primary key,cname varchar(10) not null);

Query OK, 0 rows affected (0.01 sec)

mysql> desc class;

+-------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| cid  | int(11)    | NO  | PRI |        |      |

| cname | varchar(10) | NO  |    |        |      |

+-------+-------------+------+-----+---------+-------+

3.给学生表增添三个字段:住址address;

mysql> alter table student add column address varchar(10);

Query OK, 0 rows affected (0.09 sec)

Records: 0  Duplicates: 0  Warnings: 0

这是充实的字段address:

mysql> desc student;

+----------+-------------+------+-----+---------+----------------+

| Field    | Type        | Null | Key | Default | Extra          |

+----------+-------------+------+-----+---------+----------------+

| sid      | int(11)    | NO  | PRI | NULL    | auto_increment |

| sname    | varchar(10) | NO  |    |        |                |

| sex      | varchar(10) | NO  |    |        |                |

| birthday | date        | YES  |    | NULL    |                |

| age      | int(11)    | YES  |    | NULL    |                |

| cid      | int(11)    | YES  |    | NULL    |                |

| address  | varchar(10) | YES  |    | NULL    |                |

+----------+-------------+------+-----+---------+----------------+

7 rows in set (0.01 sec)

4.修改学生表性别字段为gender;

mysql> alter table student change sex gender varchar(10);

Query OK, 0 rows affected (0.02 sec)

Records: 0  Duplicates: 0  Warnings: 0

修改后的student表:

mysql> desc student;

+----------+-------------+------+-----+---------+----------------+

| Field    | Type        | Null | Key | Default | Extra          |

+----------+-------------+------+-----+---------+----------------+

| sid      | int(11)    | NO  | PRI | NULL    | auto_increment |

| sname    | varchar(10) | NO  |    |        |                |

| gender  | varchar(10) | YES  |    | NULL    |                |

| birthday | date        | YES  |    | NULL    |                |

| age      | int(11)    | YES  |    | NULL    |                |

| cid      | int(11)    | YES  |    | NULL    |                |

| address  | varchar(10) | YES  |    | NULL    |                |

+----------+-------------+------+-----+---------+----------------+

7 rows in set (0.01 sec)

5.给birthday加多私下认可值为三千-01-01;

mysql> alter table student modify birthday date default '2000-01-01';

Query OK, 0 rows affected (0.03 sec)

Records: 0  Duplicates: 0  Warnings: 0

转移birthday的暗许值:

mysql> desc student;

+----------+-------------+------+-----+------------+----------------+

| Field    | Type        | Null | Key | Default    | Extra          |

+----------+-------------+------+-----+------------+----------------+

| sid      | int(11)    | NO  | PRI | NULL      | auto_increment |

| sname    | varchar(10) | NO  |    |            |                |

| gender  | varchar(10) | YES  |    | NULL      |                |

| birthday | date        | YES  |    | 2000-01-01 |                |

| age      | int(11)    | YES  |    | NULL      |                |

| cid      | int(11)    | YES  |    | NULL      |                |

| address  | varchar(10) | YES  |    | NULL      |                |

+----------+-------------+------+-----+------------+----------------+

6.给性别字段加多默许值为男;

mysql> set names gbk;

Query OK, 0 rows affected (0.02 sec)

mysql> alter table student modify gender varchar(10) default '男';

Query OK, 0 rows affected (0.04 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql> desc student;

+----------+-------------+------+-----+------------+----------------+

| Field    | Type        | Null | Key | Default    | Extra          |

+----------+-------------+------+-----+------------+----------------+

| sid      | int(11)    | NO  | PRI | NULL      | auto_increment |

| sname    | varchar(10) | NO  |    |            |                |

| gender  | varchar(10) | YES  |    | 男          |                |

| birthday | date        | YES  |    | 2000-01-01 |                |

| age      | int(11)    | YES  |    | NULL      |                |

| cid      | int(11)    | YES  |    | NULL      |                |

| address  | varchar(10) | YES  |    | NULL      |                |

+----------+-------------+------+-----+------------+----------------+

7.删除age字段;

mysql> alter table student drop age;

Query OK, 0 rows affected (0.01 sec)

mysql> desc student;

+----------+-------------+------+-----+------------+----------------+

| Field    | Type        | Null | Key | Default    | Extra          |

+----------+-------------+------+-----+------------+----------------+

| sid      | int(11)    | NO  | PRI | NULL      | auto_increment |

| sname    | varchar(10) | NO  |    |            |                |

| gender  | varchar(10) | YES  |    | 男          |                |

| birthday | date        | YES  |    | 2000-01-01 |                |

| cid      | int(11)    | YES  |    | NULL      |                |

| address  | varchar(10) | YES  |    | NULL      |                |

+----------+-------------+------+-----+------------+----------------+

9.给班级表插入3个班级;

mysql> insert into class values(1001,'一班');

Query OK, 1 row affected (0.03 sec)

mysql> insert into class values(1002,'二班');

Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(1003,'三班');

Query OK, 1 row affected (0.00 sec)

mysql> select * from class;

+------+-------+

| cid  | cname |

+------+-------+

| 1001 | 一班    |

| 1002 | 二班      |

| 1003 | 三班      |

+------+-------+

10.在学生表中给种种班级增添3名学生音讯;

mysql> insert into student values(1,'张三','男','2012-01-02',1001,'cq');

Query OK, 1 row affected (0.00 sec)

mysql> insert into student values(null,'李四','女','2009-03-22',1002,'cq');

Query OK, 1 row affected (0.00 sec)

mysql> insert into student values(null,'王五','男','2009-03-25',1003,'cq');

Query OK, 1 row affected (0.00 sec)

mysql> select *from student;

+-----+-------+--------+------------+------+---------+

| sid | sname | gender | birthday  | cid  | address |

+-----+-------+--------+------------+------+---------+

|  1 | 张三      | 男      | 2012-01-02 | 1001 | cq      |

|  2 | 李四      | 女      | 2009-03-22 | 1002 | cq      |

|  3 | 王五      | 男      | 2009-03-25 | 1003 | cq      |

+-----+-------+--------+------------+------+---------+

8.给学生表的cid上增多外键约束,以参照他事他说加以考察class表中的cid字段;

mysql> alter table student add constraint fk_cid foreign key(cid) references class(cid);

本文由澳门在线威尼斯官方发布于电脑数据库,转载请注明出处:开发不得不注意的坑

关键词:

上一篇:没有了

下一篇:没有了