1. 程式人生 > >nodejs之MAC上終端操作mysql資料庫(一)

nodejs之MAC上終端操作mysql資料庫(一)

-------------刪除解除安裝mysql資料庫---------

解除安裝MySQL,終端執行:

  • 開啟終端視窗
  • 使用mysqldump備份你的資料庫將文字檔案!
  • 停止資料庫伺服器
  • sudo rm /usr/local/mysql
  • sudo rm -rf /usr/local/mysql*
  • sudo rm -rf /Library/StartupItems/MySQLCOM
  • sudo rm -rf /Library/PreferencePanes/My*
  • edit /etc/hostconfig and remove the line MYSQLCOM=YES-----------這一句可以不執行
  • rm -rf ~/Library/PreferencePanes/My*
  • sudo rm -rf /Library/Receipts/mysql*
  • sudo rm -rf /Library/Receipts/MySQL*
  • sudo rm -rf /private/var/db/receipts/*mysql*

檢視MySQL伺服器配置資訊 -------

1.*******************啟動Mysql應用程式

從mysq了官網下載mysql服務安裝完成後的路徑如下:

啟動MySQL服務 sudo /usr/local/MySQL/support-files/mysql.server start

停止MySQL服務 sudo /usr/local/mysql/support-files/mysql.server stop

重啟MySQL服務 sudo /usr/local/mysql/support-files/mysql.server restart

2.*************連線mysql***********

 mysql 命令。      -u 後面接使用者名稱

    root超級管理員,擁有最高許可權。

    -p 後面接密碼

開啟終端輸入如下命令:  /usr/local/mysql/bin/mysql -u root -p 或者

/usr/local/mysql/bin/mysql -u root -p

-h127.0.0.1

(注意:Windows下的是:  mysql -u root -p)

其中root為使用者名稱。這時會出現如下命令:Enter password:  ******(,也可以不輸入密碼直接回車;這個密碼mysql服務安裝好後會分配一個密碼,後期可以自己改)

這樣就可以訪問你的資料庫伺服器了。

斷開資料庫連線:quit或者exit或者\q

****設定別名:

1)alias mysql=/usr/local/mysql/bin/mysql

2)alias mysqladmin=/usr/local/mysql/bin/mysqladmin

設定了別名後就可以用別名代替原來的一長串;這樣設定了後,如果重啟終端,就沒效果了;想要長期有效果.就要修改檔案.讓終端啟動的時候載入:

在終端輸入 : cd ~
vim ./bash_profile

後再這個檔案中新增下面兩句話:

alias mysql=/usr/local/mysql/bin/mysql

alias mysqladmin=/usr/local/mysql/bin/mysqladmin

儲存退出,重啟終端或者開新視窗即可(

這要主要看是用什麼程式來編輯檔案。

如果是vi,則:Esc 退出編輯模式,輸入以下命令:

:wq  儲存後退出vi,若為 :wq! 則為強制儲存後退出(常用)

:w    儲存但不退出(常用)

:w!   若檔案屬性為『只讀』時,強制寫入該檔案

:q    離開 vi (常用)

:q!   若曾修改過檔案,又不想儲存,使用 ! 為強制離開不儲存檔案。

:e!   將檔案還原到最原始的狀態!


 

或者如下操作配置環境變數,設定mysql的路徑:

對於如何快捷訪問mysql的方法各不相同,繁簡各異,此處本人採用自認比較簡單的配置方法:

配置使用者檔案.bash_profile (如果沒有此檔案,以下操作,會自動建立)中新增如下配置即可,

開啟Terminal,輸入:vim .bash_profile

進入編輯介面,新增以下內容:export PATH=$PATH:/usr/local/mysql/bin

按下esc鍵,輸入 :wq 儲存退出

使配置檔案生效:source .bash_profile

-----

$ /usr/local/mysql/bin/mysql -u root -p  
Enter password:   
但每次都要輸入這麼一長串字元,也過於繁瑣,需要用alias命令列去簡化
$ vim ~/.bash_profile   

追加內容:
alias mysql='/usr/local/mysql/bin/mysql';  
注意等號前後不要有空格
最後,要使~/.bash_profile檔案生效,我們必須使用 source 命令:
$ source ~/.bash_profile  
以後我們使用時,就不需要再輸入那麼多麻煩的指令了,So Easy。

3.*************修改或設定mysql連線密碼*******(cihQh-c+m1pk)

**開啟終端,輸入sudo -i  命令,並回車,切換ROOT使用者;

**進入mysql安裝目錄的bin目錄,mysql預設安裝目錄為/usr/local/mysql。輸入命令  cd /usr/local/mysql/bin/並回車;

**輸入./mysqladmin -u root -p password 123456命令,注意123456為您的新密碼。命令輸入之後回車;

**此時為要求我們輸入mysql以前的密碼,即mysql初始化的密碼。輸入好之後回車,彈出如下圖,如果內容不同,則沒修改成功:

或者使用:alter user user() identified by "123456"; 

***********修改密碼也可以直接修改mysql資料庫的user表:注意mysql5.7沒有password欄位了,換成了authentication_string;

update mysql.user set authentication_string=password('123456') where User='root' and Host='localhost';

如果報錯,嘗試一下下面的方法:越過許可權直接進入資料庫

1)關閉MySQL服務,Stop MySQL Server,running變為stopped

2)然後,開啟Terminal,輸入:sudo su回車

輸入你當前mac使用者的管理密碼,回車

./mysqld_safe --skip-grant-tables --skip-networking&回車

此時mysql會啟動,這個命令是讓我們暫時越過許可權機制,不需要password,直接登入MySQL

或者:

1.停止mysqld服務

2.編輯配置檔案

/etc/my.cnf或者是/etc/mysql/mysql.conf.d/mysqld.cnf

在配置檔案中新增配置項

skip-grant-tables

3.啟動mysqld服務

4.執行mysql

注意:正式的應用時要把這一行程式碼去掉,為了安全;

3)command+T再開啟一個Terminal,不要關閉之前的Terminal,

root登入:mysql -u root回車

修改root密碼update mysql.user set password=PASSWORD('你的password') where User='root';

重新整理許可權flush privileges;

OK,至此,問題搞定!

4.***********MYSQL的使用*******

===navicat檢視結構====

可以建立多個數據庫連線,也就是可以連線多個不同地址的伺服器;

每一個連線下面可以建立多個數據庫;

----------------------------------------資料庫的操作-------------------------------------------------------

=====檢視資料庫伺服器上面有哪些資料庫==========

   SHOW DATABASES;(大小寫都可以,規則是大寫,最後的分號不能忘記,分號相當於結束符號);

======資料庫的命名規則========

   關鍵字與函式名稱全部大寫

   資料庫名稱、表名稱、欄位名稱全部小寫

   SQL語句必須以分號結尾

===建立資料庫===

create database firstDB;   //firstDB是資料庫名

===alter修改資料庫====

預設建立的資料庫預設不支援中文字元,如果我們需要它支援中文字元,則將它的編碼設定為utf8格式:

 ALTER DATABASE firstDB  CHARACTER SET UTF8;

===使用資料庫==

use firstDB;

====檢視當前使用的資料庫====

select database();

===drop 刪除資料庫===

drop database firstDB;

-----------------------表的操作------------------

修改欄位,欄位操作很多:新增(add)、修改(modify)、重名(change)、刪除(drop)

====建立表===

建立資料庫-》use資料庫-》建立表:

create table PEOPLE ( ////PEOPLE 是表名

ID int AUTO_INCREMENT PRIMARY KEY,

 NAME varchar(20) not null,

 AGE int not null,

 BIRTHDAY datetime);

====create 利用已有資料建立新表===

create table newTable select * from PEOPLE;//PEOPLE是已經有的標;newTable是新建立的表;

====複製表====

create table 新表名 like 被複製表名; 

=====show 顯示當前資料庫所有的標====

show tables;

====desc 查看錶結構===

desc PEOPLE; //PEOPLE 是表名

 describe 表名;       show columns from  表名;

======alter 修改表結構(增、刪、改)=====================

預設建立的表不支援中文字元,所以需將表編碼設定為utf8:

修改原有欄位名稱及型別:
ALTER TABLE bulletin CHANGE uid username VARCHAR(50) NOT NULL DEFAULT '';

新增新欄位:

alter table bulletin add citycode varchar(6) not null default 0; # 城市程式碼

1.建立資料庫時設定編碼

create database test character set utf8;

2.建立表時設定編碼

create table test(id int primary key)DEFAULT charset=utf8;

3.修改資料庫編碼

alter database test character set utf8;

4.修改表預設編碼

alter table test character set utf8;

5.修改欄位編碼

alter table test modify col_name varchar(50) CHARACTER SET utf8;

---------新增索引方法---------

1.新增PRIMARY KEY(主鍵索引)

mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

2.新增UNIQUE(唯一索引)

mysql>ALTER TABLE `table_name` ADD UNIQUE (

`column`
)


3.新增INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )


4.新增FULLTEXT(全文索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT (
`column`
)

5.新增多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

== alter 新增欄位===

alter table  表名  add  欄位名  資料型別[位置];

ALTER TABLE user  ADD COLUMN paypassword  VARCHAR(100) DEFAULT NULL;//****這句有效

altertable PEOPLEaddstarBOOL;//star是新增的欄位,在MySQL裡,布林型別會自動轉換為tinyint(1)型別。

==alter 修改欄位型別====

altertable PEOPLEMODIFYstarint;

===刪除欄位====

  alter  table  表名   drop  [column] 欄位名;    

altertable PEOPLEDROPcolumnstar;

==rename 重命名錶名===

rename命令格式:rename table 原表名 to 新表名;

RENAMETABLEPEOPLETONEW_PEOPLE;//NEW_PEOPLE是新的表名稱;

===null or not null修改表字段允許為空或不允許為空:===

把 PEOPLE 表的 AGE 欄位設定成“允許為空”,即插入記錄時這個欄位可以不錄入。否則相反。

alter table 表名  modify  欄位名  資料型別  [位置];

ALTER TABLE PEOPLE MODIFY AGE INT(3) NULL;

alter table 表名 alter column 欄位名 drop default; (若本身存在預設值,則先刪除)//****這句有效

alter table 表名 alter column 欄位名 set default 預設值;(若本身不存在則可以直接設定)//****這句有效

====舊欄位修改成新欄位名===

alter table 表名  change  舊欄位名  新欄位名  資料型別 ;

====刪除表======

刪除資料表: drop  table  表名1,表名2,……;         一次性刪除多個表

------------------------------資料的操作(增刪改查)--------------------------------------------

*******insert into新增資料***********

insertintoPEOPLE VALUES (null, 'Anny', 22, '1992-05-22');//向表PEOPLE中出入一組資料,小括號中的資料要和建立表時的欄位對應;

1、insert into
insert into表示插入資料,資料庫會檢查主鍵(PrimaryKey),如果出現重複會報錯。

2、insert ignore into
當插入資料時,如出現錯誤時,如重複資料,將不返回錯誤,只以警告形式返回。所以使用ignore請確保語句本身沒有問題,否則也會被忽略掉。insert ignore表示,如果中已經存在相同的記錄,則忽略當前新資料。
INSERT IGNORE INTO books (name) VALUES ('MySQL Manual')

3、replace into
如果存在primary or unique相同的記錄,則先刪除掉。再插入新記錄。如果記錄有多個欄位,在插入的時候如果有的欄位沒有賦值,那麼新插入的記錄這些欄位為空。
replace into表示插入替換資料,需求表中有PrimaryKey,或者unique索引的話,如果資料庫已經存在資料,則用新資料替換,如果沒有資料效果則和insert into一樣。
REPLACE INTO books SELECT 1, 'MySQL Manual' FROM books

4、on duplicate key update
當primary或者unique重複時,則執行update語句,在原有記錄基礎上,更新指定欄位內容,其它欄位內容保留。如update後為無用語句,如id=id,則同1功能相同,但錯誤不會被忽略掉。
例如,為了實現name重複的資料插入不報錯,可使用一下語句:
INSERT INTO books (name) VALUES ('MySQL Manual') ON duplicate KEY UPDATE id = id;

5、insert … select … where not exist
根據select的條件判斷是否插入,可以不光通過primary 和unique來判斷,也可通過其它條件。例如:
INSERT INTO books (name) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)

注:如果使用的是insert into 發現重複的會報錯,而insert ignore  into 發現將要插入的資料行中包含唯一索引的欄位值已存在,會丟棄掉這行資料,不做任何處理;REPLACE發現重複的先刪除再插入,如果記錄有多個欄位,在插入的時候如果有的欄位沒有賦值,那麼新插入的記錄這些欄位為空。

===delete 刪除資料:=======

delete from PEOPLE where name = 'one';//刪除了name是one的記錄

======update 修改資料:=====

update PEOPLE set name='Calvin' where name = 'two';//修改name欄位的值

===select表查詢=======

select *fromPEOPLE; //**select查看錶中的所有資料,*代表所有欄位。

select NAME, AGE, BIRTHDAY from PEOPLE; //select <欄位名,欄位名,…> from <表名>。

------------------檢視的操作------------------------------------

檢視是從資料庫裡匯出一個或多個表的虛擬表,是用來方便使用者對資料的操作。

當檢視資料有變化時(增、刪、改),真實的表資料也會隨著改變。也就是說,對檢視的操作就是對錶的資料,所以我們可以把檢視當作表。

=======建立檢視===

CREATE VIEW PEOPLE_VIEW (

 NAME, AGE)

 AS SELECT NAME, AGE FROM PEOPLE;//從PEOPLE表中拿出NAME, AGE兩個欄位建立檢視PEOPLE_VIEW,其中檢視包含了NAME, AGE兩個欄位;

=======檢視檢視=======

SELECT * FROM PEOPLE_VIEW;//檢視檢視所有資料

 desc PEOPLE_VIEW;//檢視檢視結構;

======建立或替換原有檢視=====

CREATEOR REPLACEVIEWPEOPLE_VIEW(PEOPLE_ID,PEOPLE_NAME,PEOPLE_AGE)ASSELECTID,NAME,AGEFROMPEOPLE;//新檢視的三個欄位分別從表PEOPLE中的ID,NAME,AGE欄位獲取;

=====刪除檢視=======

DROPVIEWPEOPLE_VIEW;

————————----------—複合操作———————----------

====查詢資料完整語法====

select 欄位名/*

from  資料來源

[where 條件子句]

[group by 子句]

[having 子句]

[order by 子句]

[limit 子句];

==去除重複的記錄======

select distinct *  from  my_student;

=====插入多條資料======

insert into my_student values(null,'itcast01','張三','男'),(null,'itcast02','李四','男'),(null,'itcast03','王五','女'),(null,'itcast03','男');

======欄位別名======

select id,number as 學號,name as 姓名, sex 性別 

from my_student;

=====where子句=====

使用 AND 或者 OR 指定一個或多個條件。

SELECT 欄位1,欄位2,... FROM 表1, 表2,... WHERE condition1 AND 或者OR condition2.....

where子句中的操作符:

= 等號,檢測兩個值是否相等,如果相等返回true (A = B) 返回false。 
<>, !=  不等於,檢測兩個值是否相等,如果不相等返回true (A != B) 返回 true。 
> 大於號,檢測左邊的值是否大於右邊的值, 如果左邊的值大於右邊的值返回true (A > B) 返回false。 
< 小於號,檢測左邊的值是否小於右邊的值, 如果左邊的值小於右邊的值返回true (A < B) 返回 true。 
>= 大於等於號,檢測左邊的值是否大於或等於右邊的值, 如果左邊的值大於或等於右邊的值返回true (A >= B) 返回false。
<= 小於等於號,檢測左邊的值是否小於於或等於右邊的值, 如果左邊的值小於或等於右邊的值返回true (A <= B) 返回 true。

原理:where是唯一一個直接從磁盤獲取資料的時候就開始判斷的條件:從磁碟取出一條記錄,開始進行where判斷,判斷的結果如果成立儲存到記憶體,反之放棄。

---找學生id為1,3,5的學生

select  *  from  my_student  where id =1 || id =3 || id =5;

或者select * from my_student where id in(1,3,5);

======like子句===========

SQL LIKE 子句中使用百分號 %字元來表示任意字元,類似於UNIX或正則表示式中的星號 *

如果沒有使用百分號 %, LIKE 子句與等號 = 的效果是一樣的。

  • 可以在 WHERE 子句中使用LIKE子句。
  • 你可以使用LIKE子句代替等號 =
  • LIKE 通常與 % 一同使用,類似於一個元字元的搜尋

一般like與where一起使用;

SELECT * from表名WHEREnameLIKE'%COM';//查詢表中所有name是COM結尾的記錄;

====== UNION==========

 UNION 操作符用於連線兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的資料。

語法格式:

SELECT expression1, expression2,... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2,... expression_n
FROM tables
[WHERE conditions];, expression2,... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2,... expression_n
FROM tables
[WHERE conditions];

引數

  • expression1, expression2, ... expression_n: 要檢索的列。

  • tables: 要檢索的資料表。

  • WHERE conditions: 可選, 檢索條件。

  • DISTINCT: 可選,刪除結果集中重複的資料。預設情況下 UNION 操作符已經刪除了重複資料,所以 DISTINCT 修飾符對結果沒啥影響。

  • ALL: 可選,返回所有結果集,包含重複資料。

=======group by  欄位 [asc/desc];   分組  根據某個欄位進行分組,相同的放一組,不同的分到不同的組。統計的是資料,不是記錄

--按性別分組

select * from my_student group by sex; 這是絕對錯誤的,分組是為了統計資料,按分組欄位進行資料統計

=======SQL提供了一系列統計函式======

Count();  統計分組後的記錄數,每一相同的組有多少行記錄

Max();   統計每組最大的值

Min();   統計每組最小的值

Avg();   統計每組的平均值

Sum();   統計每組的和

---身高高矮,平均年齡,和總年齡

select sex,count(*),max(height),min(height),avg(age),sun(age)   from my_student  group by sex;

注意單獨使用group by而不使用統計函式,是沒意義的!,通常能是一起使用;

多欄位分組:先根據一個欄位進行分組,然後對分組後的結果再次按照其他欄位分組。

=====having子句========

與where子句一樣進行條件判斷,一般是group by……having……組合; 而不是group by……where???

進行資料統計時,是資料進入記憶體之後,會進行分組-》統計-》having條件判斷。而where是針對從磁碟讀取資料時進行判斷,此刻還沒分組,進行統計就判斷了。所以用group by……having……組合;

---求出所有班級人數大於等於2的學生人數

====order by 子句=====

order by根據某個欄位進行升序或降序排序,依賴校對集

基本語法: order by 欄位名 [asc/desc];  asc升序 可不寫      desc降序

=====limit子句是一種限制結果的語句

1)用來限制數量

--查詢學生前兩個   select * from my_student limit 2;

2)限制起始位置  limit 起始位置,長度

--查從編號4開始,詢找兩個學生

select * from my_student limit 4,2;

======內連線,外連線(左外連線、右外連線),自然連線,交叉連線====

====內連線,包括相等聯接和自然聯接。 從左表中取出每一條記錄,和右表中所有的記錄進行匹配,匹配必須是左表中與右表中某個條件相同,最終會保留結果,否則不保留。----就是交叉連線加上條件後的結果;

基本語法:  左表 [inner] join 右表  on 左表.欄位 = 右表.欄位;

select * from my_student inner join my_class on my_student.C_id = mu_class.id;


2、外聯接。外聯接可以是左向外聯接、右向外聯接或完整外部聯接。     
在 FROM子句中指定外聯接時,可以由下列幾組關鍵字中的一組指定:     
1)

左外連線:左表為主,然後每條記錄與右表進行連線,不管能不能匹配的上,左表都會保留。能匹配,右表某條記錄保留,不能匹配,某條記錄置為NULL,最終記錄數至少不少於左表已有的記錄。

基本語法:  左表  left join  右表  on  左表.欄位 = 右表.欄位;

左向外聯接的結果集包括  LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。       
2)右外連線RIGHT  JOIN 或 RIGHT  OUTER  JOIN
右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。       
3)全外連線:FULL  JOIN 或 FULL OUTER JOIN
完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。   

3、交叉聯接   ---就是不設定任何條件的連結結果
交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。    
FROM 子句中的表或檢視可通過內聯接或完整外部聯接按任意順序指定;但是,用左或右向外聯接指定表或檢視時,表或檢視的順序很重要。有關使用左或右向外聯接排列表的更多資訊,請參見使用外聯接。    

 a表     id   name      b表     id   job   parent_id   
              1   張3                   1     23     1   
              2   李四                 2     34     2   
              3   王武                 3     34     4       
  a.id同parent_id   存在關係   

--------------------------------------------------    
 1) 內連線   
  select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id       
  結果是     
  1   張3                   1     23     1   
  2   李四                  2     34     2   
    
  2)左外連線   
  select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id       
  結果是     
  1   張3                   1     23     1   
  2   李四                  2     34     2   
  3   王武                  null   

3) 右外連線   
  select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id       
  結果是     
  1   張3                   1     23     1   
  2   李四                  2     34     2   
  null                        3     34     4   

4) 完全外連線   ---mysql不支援
  select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   

  結果是     
  1   張3                  1     23     1   
  2   李四                 2     34     2   
  null                   3     34     4   
  3   王武                 null

=======檢視資料庫相關操作的過程======

show create table people; 可以建立表的程式碼以及儲存引擎,同時可以看到外來鍵的設定。

------------————————--約束————————————————————

===主鍵約束====

主鍵是表的標誌列,在mysql中支援將一個或多個欄位作為一個主鍵來使用。關係資料庫依賴於主鍵,主鍵在物理層面只有兩個用途:
唯一的標誌一行記錄作為一個可以被外來鍵引用的有效物件。 2>設定主鍵:
建立主鍵分為單字主鍵和複合主鍵

單字主鍵建立只需在欄位後邊新增primary key;

******在建立表的時候新增單字主鍵age int primary key;

*****在建立表的時候新增複合主鍵:primary key(age,name);

********如果有一張表,建立的時候沒有新增主鍵,現在要給它新增主鍵:
alter table people add primary key(欄位名稱);

****修改主鍵修改主鍵有兩種可能,一種是表中有主鍵,需要將主鍵修改在其它欄位上,另一種是表中沒有主鍵,需要修改欄位型別,使其成為主鍵。型別的修改要使用modify關鍵字。
對於已經設定了主鍵的表,主鍵的修改不能夠直接執行。必須先刪除原有主鍵,再重新設定主鍵。主鍵的刪除只是刪除了指定欄位或欄位組的主鍵約束,並不能夠刪除欄位或欄位組,一個表中只能有一個主鍵。

前邊建的book表有主鍵欄位組(bnum、typeid),現將表中的原有主鍵刪除,將欄位bnum修改為主鍵。

**** 刪除主鍵:alter table people drop primary key;

*****新增主鍵:alter table people add primary key(欄位名稱);

============外來鍵約束==========

外來鍵記錄了表與表之間欄位的聯絡。外來鍵將不同表的欄位關聯起來,使這些資料在修改、刪除時有著關聯,在資料操作時維護這些資料完整性。
外來鍵有兩個作用:

讓資料自己通過外來鍵來保證資料的完整性和一致性能夠增加資料庫表關係的可讀性

外來鍵的定義還要遵循以下的情況:所有的表必須是InnoDB型,它們不能是臨時表,mysql中只有InnoDB型別的表才支援外來鍵所有要建立外來鍵的欄位必須建立約束對於非InnoDB表,foreign key 子句會被忽略;

alter table people add [constraint 外來鍵名] foreign key [id] (主表中的一個作為外來鍵的欄位, …) references 另一張表 (另一張表的元一個欄位, …)[on delete {cascade | set null | no action | restrict}][on update {cascade | set null | no action | restrict}]---------後面兩個方括號是可選的,花括號裡面的值是方括號的可選值;

可以看到mysql對建立外來鍵要求嚴格,精確到欄位的型別和長度。
對於外來鍵最好採用 on delete restrict 和on update cascade的方式。
cascade:外來鍵表中外來鍵欄位值會跟隨父表被跟新,或所在的列會被刪除。
no action:不進行任何關聯操作
restrict:restrict相當於no action,即不進行任何操作。拒絕父表修改外來鍵關聯列,刪除記錄。
set null:在父表的外來鍵關聯欄位被修改和刪除時,外建表的外來鍵列被設定為空(null)。

對於資料的新增,子表的外來鍵列輸入的值,只能是父表外來鍵關聯列已有的值,否則出錯。
**********現有剛剛建立的表student和book。把book中typeid欄位對應student表中的sid欄位

alter table book add constraint typeid foreign key(typeid) references student(sid) on delete ;

主表:

CREATE TABLE class(

cla_id INT(6) AUTO_INCREMENT PRIMARY KEY,

cla_name VARCHAR(30) NOT NULL UNIQUE

);

從表:

CREATE TABLE students(

stu_id INT(10) AUTO_INCREMENT PRIMARY KEY,

stu_name VARCHAR(30) NOT NULL,

stu_score FLOAT(5,2) DEFAULT 0.0,

cla_id INT(10),

CONSTRAINT FK_CLA_ID FOREIGN KEY(cla_id) REFERENCES class(cla_id)#新增外來鍵約束

);

也可以這樣新增:

ALTER TABLE students ADD CONSTRAINT FK_CLA_ID FROEIGN KEY(cla_id) REFERENCES class(cla_id);

**********刪除外來鍵:******
alter table people drop foreign key 外來鍵名;

一張表的外來鍵可能不止一個,刪除多個外來鍵可以重複使用上述語句。

#外來鍵中的級聯關係有以下幾種情況:

ON DELETE CASCADE 刪除主表中的資料時,從表中的資料隨之刪除

ON UPDATE CASCADE 更新主表中的資料時,從表中的資料隨之更新

ON DELETE SET NULL 刪除主表中的資料時,從表中的資料置為空

#預設 刪除主表中的資料前需先刪除從表中的資料,否則主表資料不會被刪除

CREATE TABLE students(

stu_id INT(10) AUTO_INCREMENT PRIMARY KEY,

stu_name VARCHAR(30) NOT NULL,

stu_score FLOAT(5,2) DEFAULT 0.0,

cla_id INT(10),

CONSTRAINT 外來鍵名 FOREIGN KEY(主表字段) REFERENCES class(從表字段ON DELETE CASCADE

);

CREATE TABLE students(

stu_id INT(10) AUTO_INCREMENT PRIMARY KEY,

stu_name VARCHAR(30) NOT NULL,

stu_score FLOAT(5,2) DEFAULT 0.0,

cla_id INT(10),

CONSTRAINT 外來鍵名 FOREIGN KEY(主表字段) REFERENCES class(從表字段) ON UPDATE CASCADE

);

CREATE TABLE students(

stu_id INT(10) AUTO_INCREMENT PRIMARY KEY,

stu_name VARCHAR(30) NOT NULL,

stu_score FLOAT(5,2) DEFAULT 0.0,

cla_id INT(10),

CONSTRAINT 外來鍵 FOREIGN KEY(cla_id) REFERENCES class(cla_id) ON DELETE SET NULL

);

注:插入資料時,先插入主表中的資料,再插入從表中的資料。

    刪除資料時,先刪除從表中的資料,再刪除主表中的資料。

======非空約束=======
被設定了非空約束的欄位,在新增資料的時候必須要有資料。非空約束限制欄位中的內容不能為空,但可以是空串或0
在建立表的時候直接在欄位型別後邊新增 not null 或null,即可設定為欄位非空或者空。
**********把已有的表某個欄位設定為非空:

alter table people modify 欄位名 欄位型別 not null;

alter table people modify name varchar(20)  not null;

========唯一性約束==========================

唯一性約束(unique constraint)要求新增該約束的列欄位的值唯一,允許為空,但只能出現一個空值。唯一約束可以確保一列或多列不出現重複值。

建立唯一約束欄位:

一個表可以有多個唯一約束,一個約束可以只有一列,當然也可以有多列。

*******在建表時,可以直接建立唯一約束,可以直接在欄位的資料型別後邊直接新增unique關鍵字,

CREATETABLE tab( 

fa intNOTNULL unique

fb intNOTNULL

)

*****也可以在所有欄位定義之後使用[constraint <約束名>] unique(<欄位名>)

CREATETABLE tab( 

fa intNOTNULL

fb intNOTNULL

CONSTRAINT 約束名稱 UNIQUE (fa ,fb ) //可以使用UNIQUE (fa ,fb );如果要為UNIQUE約束分配一個指定的名稱,就要使用CONSTRAINT子句

)

*******對於已經存在的表和欄位,新增唯一約束要使用add關鍵字:

alter table table_name add unique(欄位列表);

*********其他方式新增唯一約束“

ALTER TABLE 表名 MODIFY 欄位 INT(10) UNIQUE;

ALTER TABLE 表名 CHANGE 舊欄位 新欄位 INT(10) UNIQUE;

ALTER TABLE 表名 ADD UNIQUE(欄位);

ALTER TABLE 表名 ADD UNIQUE KEY(欄位);

ALTER TABLE 表名 ADD CONSTRAINT 唯一約束名 UNIQUE(欄位);

ALTER TABLE 表名 ADD CONSTRAINT 唯一約束名 UNIQUE KEY(欄位);

**************刪除指定名稱的約束

mysql中,一個欄位的所有約束都可以同名;

約束名刪除,使用drop index語句:

alter table table_name drop index 約束名(或者有唯一約束的欄位名);或者

DROP INDEX 約束名(或者有唯一約束的欄位名) ON table_name;

======== 自增約束===========

自增約束是一種由系統自動增加並填入欄位數值的約束。
auto_increment是資料列的一種屬性,只適用於整數型別資料列,
auto_increment資料列必須有唯一約束,以避免序號重複,
mysql一張表中只能有一個auto_increment欄位
當使用truncate table table_name 刪除全部資料時,auto_increment會從1重新開始編號,
自增欄位的值只能一次加1,而不能像SQL Server資料庫中的自增約束一樣,每次加2、每次加3,
在InnoDB資料表中,不可通過 create table or alter table 的auto_increment=n 語句來改變自增初值。

新增自增長

1)在建立表的時候新增

CREATE TABLE 表名稱(

 user_id INT(10) AUTO_INCREMENT PRIMARY KEY

 );

2)通過ALTER語句

ALTER TABLE 表名稱 MODIFY 欄位 INT(10) AUTO_INCREMENT;

ALTER TABLE 表名稱 CHANGE 舊欄位 新欄位 INT(10) AUTO_INCREMENT;

刪除自增長

ALTER TABLE 表名 MODIFY 欄位 INT(10);

ALTER TABLE 表名 CHANGE 舊欄位 新欄位 INT(10);

一張表只能有一個自增長列,並且該列必須定義了約束(可以是主鍵約束,也可以是唯一約束,也可以是外來鍵約束,但是不可以是非空和檢查約束)

不過自增長一般配合主鍵使用,並且只能在數字型別中使用;

=============ZEROFILL(零填充)=============

新增零填充

1)在建立表的時候新增

CREATE TABLE t_user(user_id INT(10) ZEROFILL);

2)通過ALTER語句

ALTER TABLE t_user MODIFY user_id INT(10) ZEROFILL;

ALTER TABLE t_user CHANGE user_id user_id INT(10) ZEROFILL;