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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM