MySQL8.0数据库出现的问题——外码创建方式、外键约束两个引用列不兼容问题、check约束问题、用触发器代替check约束、关键字DELIMITER、删除添加索引、删除添加外键约束、和一些数据库方面的操作
一、首先先说一下我们都需要建立那些表
mysql> CREATE TABLE IF NOT EXISTS `student`(
-> `sno` CHAR(8) NOT NULL,
-> `sname` CHAR(4) NOT NULL,
-> `ssex` enum('男','女') not null default '男',
-> `sage` INT,
-> `sdept` CHAR(10),
-> PRIMARY KEY ( `sno` )
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 1 warning (0.03 sec) mysql>
mysql> CREATE TABLE IF NOT EXISTS `course`(
-> `cno` CHAR(2) NOT NULL,
-> `cname` CHAR(30) NOT NULL,
-> `credit` INT,
-> `cpno` CHAR(3),
-> PRIMARY KEY ( `cno` )
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 1 warning (0.02 sec) mysql> CREATE TABLE `sc`(
-> `sno` CHAR(8) not null,
-> `cno` CHAR(2) not null,
-> `grade` INT check(grade>='0' and grade<='100'),
-> PRIMARY KEY ( cno , sno),
-> FOREIGN KEY (sno) REFERENCES student(sno),
-> FOREIGN KEY (cno) REFERENCES course(cno)
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 1 warning (0.05 sec)
上面是建立了三个表,分别是student、course、sc。上面字段我使用 `字段名` 的形式,其实也可以不加这个符号 ` 。
二、先说一下外码我的错误方式
mysql> CREATE TABLE IF NOT EXISTS `sc`(
-> `sno` CHAR(8) foreign key references student(sno),
-> `cno` CHAR(2) foreign key references course(cno),
-> `grade` INT,
-> PRIMARY KEY ( cno , sno),
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'foreign key references student(sno),
`cno` CHAR(2) foreign key references cou' at line 2
作为新手怎么也找不到。。。就只能换种方式了,就是上面创建sc表的外键方式
三、外键约束两个引用列不兼容问题
mysql> CREATE TABLE `sc`(
-> `sno` CHAR(8) not null,
-> `cno` CHAR(2) not null,
-> `grade` INT check(grade>='0' and grade<='100'),
-> PRIMARY KEY ( cno , sno),
-> FOREIGN KEY (sno) REFERENCES student(sno),
-> FOREIGN KEY (cno) REFERENCES course(cno));
ERROR 3780 (HY000): Referencing column 'sno' and referenced column 'sno' in foreign key constraint 'sc_ibfk_1' are incompatible.
一般出现这个问题,就是你从其他表引用的 字段的类型 和这个表的 字段类型 不一样(就比如一个是int类型,另一个是char类型);我得错误方式是在student表中后面有一句
ENGINE=InnoDB DEFAULT CHARSET=utf8;
而现在这个表没有指定,然后就错了,加上这一句就可以了
四、check约束问题
mysql所有的存储引擎均不支持check约束,MySQL会对check子句进行分析,但是在插入数据时会忽略,因此check并不起作用,因此实现对数据约束有两种方法:
1.在mysql种约束,如使用enum类型或者触发器等。
2.在应用程序里面对数据进行检查再插入。
五、用触发器代替check约束和关键字DELIMITER
DELIMITER \\;
这个语句就表示之后数据库的结束标志就变成了 \\ .
我上面规定成绩的范围是[0,100]用的是check约束,可是check约束无用,下面给出触发器约束
mysql> DELIMITER //
mysql> CREATE TRIGGER t_insert2 after INSERT ON sc FOR EACH ROW
-> BEGIN
-> DECLARE msg VARCHAR(200);
-> IF (new.grade < 0 or new.grade>100) THEN
-> SET msg = "成绩不符合要求";
-> signal sqlstate 'HY000' SET message_text = msg;
-> END IF;
-> END//
Query OK, 0 rows affected (0.03 sec) mysql> DELIMITER ;
查看所有触发器:
另一种查询触发器命令: show triggers;
删除触发器命令: drop trigger trigger_name;
六、删除添加索引
建立降序索引语法:
create index 索引名 on 表名(字段名 desc);
注:desc换成asc则是升序索引。
删除索引语法:
drop index 索引名;
但是我的MySQL8.0不支持这种删除索引方式,下面是从student表中删除索引sname_index报错
drop index sname_index;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
正确方式:
drop index sname_index on student;
Query OK, 0 rows affected (0.04 sec)
七、删除添加外键约束
当我们在一个表中添加字段约束的时候:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 KEY(本表内要加以外键约束的字段) REFERENCES 其他表(要被其他表用以外键约束的字段);
然后当我们想删除时:
ALTER TABLE 表名 DROP FOREIGN KEY外键约束名;
但是像我之前建立sc表的时候,我并没有给外键约束创建名字,那应该怎么删除呢?
我可以先输入
SHOW CREATE TABLE sc;
这样表结构就会出来,同样如果你没有给外键约束起名字,系统也会给它起一个
mysql> SHOW CREATE TABLE sc;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sc | CREATE TABLE `sc` (
`sno` char(8) NOT NULL,
`cno` char(2) NOT NULL,
`grade` int(11) DEFAULT NULL,
PRIMARY KEY (`cno`,`sno`),
KEY `sno` (`sno`),
CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`sno`) REFERENCES `student` (`sno`),
CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`cno`) REFERENCES `course` (`cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
这个关键字
CONSTRAINT
后面的就是这个约束的名字,然后就可以删除了,下面给出删除和添加的示例
mysql> alter table sc drop foreign key sc_ibfk_1;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE sc ADD CONSTRAINT sc_ibfk_1 FOREIGN KEY(sno) REFERENCES student(sno);
Query OK, 1 row affected (0.15 sec)
Records: 1 Duplicates: 0 Warnings: 0
八、数据库操作其他操作
查询表runoob_tb1的所有内容
select * from runoob_tbl;
向表sc插入数据
insert into sc values('1','3',105);
切换数据库至dbs(dbs是一个数据库的名字)
use dbs
展示所有数据库
show databases;
其他更多可见:https://www.runoob.com/mysql/mysql-select-query.html
MySQL8.0数据库出现的问题——外码创建方式、外键约束两个引用列不兼容问题、check约束问题、用触发器代替check约束、关键字DELIMITER、删除添加索引、删除添加外键约束、和一些数据库方面的操作的更多相关文章
- mysql-8.0 安装教程(自定义配置文件,密码方式已修改)
下载zip安装包: MySQL8.0 For Windows zip包下载地址:https://dev.mysql.com/downloads/file/?id=476233,进入页面后可以不登录.后 ...
- CentOS7.4 源码安装MySQL8.0
MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 以下为本人2018.4.23日安装过程的记录.整个过程大 ...
- mysql数据库----视图、触发器、存储过程、函数、事务、索引、其他语句
一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( S ...
- 阿里云 centos7 安装MySQL8.0.13
1.下载MySQL安装包(这里是有技巧的,说不定我这时写这个的时候版本还是你看到时的旧版本了,如果已经不是8.0了,可以根据这样来 下新版本) 先进入官网 再将这两者一结合,就是最新版本的了 所以 [ ...
- MySQL8.0在Windows下的安装和使用
前言 MySQL在Windows下有2种安装方式:1.图形化界面方式安装MySQL 2.noinstall方式安装MySQL.在这里,本文只介绍第二种方式:以noinstall方式安装MySQL,以及 ...
- 远程连接MYSQL8.0服务器问题
title: 远程连接MYSQL8.0服务器问题 date: 2018-07-07 11:02:26 updated: tags: [MYSQL,坑] description: keywords: c ...
- Linux(CentOS-8)安装MySQL8.0.11
CentOS安装MySQL8.0.11 总的思路就是:安装MySQL,编写配置文件,配置环境变量,成功开启服务,登陆并修改ROOT密码 开启远程访问的思路就是:授权用户所有IP都可以访问,系统的数据库 ...
- centos7 二进制安装mysql-8.0.19
安装包下载地址:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz 1.检 ...
- Linux mysql8.0.11安装
准备:检查是否已安装过mysql,若有便删除(linux系统自带的) rpm -qa | grep mariadb rpm -e nodeps mariadb-libs-5.5.56-2.el7.x8 ...
随机推荐
- LeetCode394 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正整数. 你可 ...
- 操作系统-1w字关于内存的总结
内存的基本概念 什么是内存,有何作用 内存是用于存放数据的硬件.程序执行前需要先放入内存中才能被CPU处理 存储单元 内存中也有一个一个的小房间,每个小房间就是一个存储单元. 如果计算机按照 字节编址 ...
- spring中的工厂模式
spring的bean的创建原理就是框架利用反射创建出实例对象 工厂模式:工厂帮我们创建对象:有一个专门帮我们创建对象的类,我们把这个类叫做工厂类. 例如:Plane plane = PlaneFac ...
- dubbo配置启动时检查
启动检查设置 Dubbo缺省会在启动时检查依赖的服务是否可用,不可用会抛出异常,阻止Spring初始化完成,默认check="true":是开启检查. 比如测试的时候,有些服务并不 ...
- C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻
这是道哥的第014篇原创 目录 一.前言 二.变量与指针的本质 1. 内存地址 2. 32位与64位系统 3. 变量 4. 指针变量 5. 操作指针变量 5.1 指针变量自身的值 5.2 获取指针变量 ...
- 【Spring】XML方式实现(无参构造 有参构造)和注解方式实现 IoC
文章目录 Spring IoC的实现方式 XML方式实现 通过无参构造方法来创建 1.编写一个User实体类 2.编写我们的spring文件 3.测试类 UserTest.java 4.测试结果 通过 ...
- 【Linux】Linux进程间通信的几种方式
一.进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据:多个进程要操作共享数据,一个进程对共享数据 信息传递:一个进程需要向另一个进程发 ...
- bash shell数组使用总结
本文为原创博文,转发请注明原创链接:https://www.cnblogs.com/dingbj/p/10090583.html 数组的概念就不多说了,大家都懂! shell数组分为索引数组和关联数 ...
- SVM 支持向量机算法-实战篇
公号:码农充电站pro 主页:https://codeshellme.github.io 上一篇介绍了 SVM 的原理和一些基本概念,本篇来介绍如何用 SVM 处理实际问题. 1,SVM 的实现 SV ...
- 与数论的厮守05:gcd(a,b)=gcd(b,a mod b)的证明
\[设c=gcd(a,b),那么a可以表示为mc,b可以表示为nc的形式.然后令a=kb+r,那么我们就\\ 只需要证明gcd(b,r)=c即可.{\because}r=a-kb=mc-knc,{\t ...