1. 程式人生 > >MySQL—概念,使用者的建立,主鍵,外來鍵,資料型別,表格建立

MySQL—概念,使用者的建立,主鍵,外來鍵,資料型別,表格建立

MySQL

 

DBMS,MySQL的概念,資料庫分類,以前MySQL的部署中的一些概念

#DBMS:資料庫管理系統,用於管理資料庫的大型軟體。mysql就是dbms的一種
#Mysql:是用於管理檔案的一個軟體
        #服務端軟體
            #socket服務端
            #本地檔案操作
            #解析指令(sql語句)
        #客戶端軟體(各種各樣)
            #socket客戶端
            #傳送指令
            #解析指令(sql語句)
#除了mysql,還有其他類似軟體: #語法大體上都是sql語句 #關係型資料庫:sqllite,db2,Oracle,access,sql server,MySQL #有比較多約束,比如欄位型別啊,表和表,欄位和欄位間依賴呀 #非關係型資料庫:MongoDB,redis #沒這麼多約束 #MySQL安裝: # bin目錄下 mysql是客戶端,mysqld是服務端 #初始化: 初始化資料庫mysqld --initialize --console。前者沒密碼
# 5.7版本需要初始化data目錄 : mysqld --initialize -insecure #如果不新增環境變數:每次啟動都要先告訴系統所在bin目錄,所以需要新增環境變數 # cmd1 啟動服務端:E:\wupeiqi\mysql - 5.7.16 - winx64\mysql - 5.7.16 - winx64\bin\mysqld # cmd2 客戶端連線:E:\wupeiqi\mysql - 5.7.16 - winx64\mysql - 5.7.16 - winx64\bin\mysql - u root - p
#windows服務:每一個window上都有很多windows服務,默默在後臺跑著 (如果不行試一下用絕對路徑) #所以可以把 mysqld這個服務端製作為,windows服務,就可以不用多開一個cmd了。首先cd到 bin目錄,輸入以下命令 # 命令為 mysqld install 或者 mysqld --install。server.msc裡就有了個mysql #移除服務:mysqld --remove #再通過命令 : net start mysql 就可以啟動了,也可以從系統服務端裡找到,右鍵啟動 #停止服務: net stop mysql #總結:解壓壓縮包---MySQL路徑具體到bin新增到環境變數---開啟cmd---切換到bin目錄---初始化【命令】---製作windows服務【mysqld install】---啟動【net start mysql】--【mysql -u root -p】 #一些指令: #show databases; #create database 【db名】;
mysql初識
#sql語句:
    #DDL: 定義語言  比如 create  drop  alter
    #DML: 操作語言  比如 insert  update  delete  select
    #DCL:控制語言  比如  grant revoke
# 註釋
#     單行註釋: --
#     多行註釋: /* ....*/
#建議 命令大寫  表名,庫名都小寫

#windows下區分大小寫的設定:
#在[mysqld] 設定lower_case_table_names = 0


# 在Linux下:
# 1、資料庫名與表名是嚴格區分大小寫的;
# 2、表的別名是嚴格區分大小寫的;
# 3、列名與列的別名在所有的情況下均是忽略大小寫的;
# 4、變數名也是嚴格區分大小寫的;

#規範是建議大寫,但是主要看公司規範
註釋,大小寫規範

建議命令大寫,表名庫名小寫

    #那在終端要怎麼備份呢?
        #用 mysqldump
        #備份:資料表結構和資料
            #開啟cmd 輸入命令: mysqldump -u root db1 > db1.sql -p 回車輸入密碼即可
            #儲存位置在 cmd行輸入時候的路徑,檔名為 db1.sql
        #只備份:資料表結構:
            #mysqldump -u root -d db1 > db1.sql -p  #多了個  -d
    #那備份的怎麼匯入呢?
        #首先建立一個數據庫 create database db_name;
        #命令: mysqldump -uroot -p密碼 db_name < 檔案路徑
MySQL dump—備份資料庫

 

 

使用者的建立,刪除,授權,取消許可權,密碼修改

'''
mysql -h localhost(或者是想連線的伺服器的 IP)  -u (主機上有的賬號) -p
'''
#http://www.cnblogs.com/wupeiqi/articles/5713315.html  資料庫操作
#一些指令:
    #show databases;
    #create database 【db名】defalut charset utf8;
            # CREATE DATABASE 資料庫名稱 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
    #drop database 【db_name】
        #資料庫沒有修改一說
    #show tables;
    # drop table table_name;
    #select user from user

#建立使用者:
    #create user 'username'@'ip' identified by 'password'
    #create user 'gkx'@'192.168.0.1' identified by 'gkx123'
    #create user 'gkx2'@'192.168.0.%' identified by 'gkx123'
    #create user 'gkx2'@'%' identified by 'gkx123'
    #使用者授權:
        #grant select,insert,update on db1.* to 'gkx'@'%'
        #grant all privileges on *.* to 'gkx'@'%'
    #取消許可權:
        #revoke all privileges from db1.* to 'gkx'@'%'

#修改密碼:
    #ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼'
    # 修改密碼另一種方式:
            # use mysql;
            # ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';
            # FLUSH PRIVILEGES;

# 刪除使用者
#     drop user '使用者名稱'@'IP地址';
# 修改使用者
#     rename user '使用者名稱'@'IP地址'  to '新使用者名稱'@'IP地址';
#         修改使用者名稱,可以通過操作user資料庫,但是不建議這麼做
#         mysql> use mysql;  選擇資料庫
#         Database changed
#         mysql> update user set user="dns" where user="root";    將使用者名稱為root的改為dns
# 修改密碼
#     set password for '使用者名稱'@'IP地址' = Password('新密碼') #8.04後開始不能用了


#但是實際生產過程中,這些都不用我們建立,DBA(database administrator)來操作,我們拿到使用者名稱及密碼即可

# show databases;
# use 資料庫名稱;
# show tables;
#select * from 表名;  or  select field1,field2 from talbename
使用者建立

 

外來鍵的定義,建立,刪除,約束條件,作用,以及外來鍵的變種

# select now(); 顯示時間
# 定義:如果一張表中有一個非主鍵的欄位指向了別一張表中的主鍵,就將該欄位叫做外來鍵。
        #如果父表的主鍵是複合主鍵,那麼子表也需要指定兩列對應     constraint fk_fkname foreign key (id1,id2) references table_name(pid1,pid2)
# 父表:外表,主鍵被指向的表, 子表:設定外來鍵的那張表
#   外來鍵的預設作用有兩點:
#   1.對子表(外來鍵所在的表)的作用:子表在進行寫操作的時候,如果外來鍵欄位在父表中找不到對應的匹配,操作就會失敗。
#   2.對父表的作用:對父表的主鍵欄位進行刪和改時,如果對應的主鍵在子表中被引用,操作就會失敗。
#外來鍵設定: 取名: 用表名就不會重複了   fk_table1_table2
    #1.節省空間
    #2.約束欄位取值
    #命令: constraint foreign_key_name  foreign key (想繫結的本表ID) references table_name(外表id);
    #******在建立好的表後 alter table my_tab1 add [constraint 外來鍵名] foreign key(外來鍵欄位名) references mytab2(主鍵欄位名);
            # (3) 檢視外來鍵:
            # SHOW CREATE TABLE ***;可以檢視到新建的表的程式碼以及其儲存引擎.也就可以看到外來鍵的設定.
            # 刪除外來鍵:
            # alter table drop foreign key '外來鍵名'.
            # 注意:
            # 只有在定義外來鍵時,用constraint 外來鍵名 foreign key .... 方便進行外來鍵的刪除.
            # 若不定義,則可以:
            # 先輸入:alter table drop foreign key -->會提示出錯.此時出錯資訊中,會顯示foreign key的系統預設外來鍵名.--->用它去刪除外來鍵.
            #對於非InnoDB表,FOREIGN KEY子句會被忽略掉。

        #···建立多個外來鍵: 約束規則預設是 restrict
            #··所以要想操作外表,必須把子表修改好了
# create table score(sid int not null auto_increment primary key,
#   number int,
#   student_id int,
#   corse_id int,
#   constraint fk_sid_student foreign key (student_id) references student(sid),
#   constraint fk_cid_course foreign key (corse_id) references course(cid)
# [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}] 可選
# [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]  可選
# )engine=innodb default charset=utf8;
'''
# 比如
# create table score(sid int not null auto_increment primary key,
#   number int,
#   student_id int,
#   corse_id int,
#   constraint fk_sid_student foreign key (student_id) references student(sid),
#   constraint fk_cid_course foreign key (corse_id) references course(cid) on delete cascade on update cascade
# )engine=innodb default charset=utf8;
'''

# 關鍵字
# CASCADE  刪除包含與已刪除鍵值有參照關係的所有記錄
# SET NULL 修改包含與已刪除鍵值有參照關係的所有記錄,使用NULL值替換(只能用於已標記為NOT NULL的欄位)
# RESTRICT 拒絕刪除要求,直到使用刪除鍵值的輔助表被手工刪除,並且沒有參照時(這是預設設定,也是最安全的設定)
# NO ACTION  InnoDB拒絕刪除或者更新父表。

# 外來鍵的定製作用----三種約束模式:
# restrict:嚴格模式(預設), 父表不能刪除或更新一個被子表引用的記錄。
# cascade:級聯模式, 父表操作後,子表關聯的資料也跟著一起操作。
# set null:置空模式,前提外來鍵欄位允許為NLL,  父表操作後,子表對應的欄位被置空。
'''
# 使用外來鍵的前提:
# 1. 表儲存引擎必須是innodb,否則建立的外來鍵無約束效果。
# 2. 外來鍵的列型別必須與父表的主鍵型別完全一致。
# 3. 外來鍵的名字不能重複。
# 4. 已經存在資料的欄位被設為外來鍵時,必須保證欄位中的資料與父表的主鍵資料對應起來。
'''

# 建立外來鍵語法:
# [CONSTRAINT[symbol]]
# FOREIGN KEY [index_name](index_col_name, ...)
# REFERENCES
# tbl_name(index_col_name, ...)
# [ON DELETE reference_option]
# [ON UPDATE reference_option]
#
# reference_option:
# RESTRICT | CASCADE | SETNULL | NOACTION
MySQL-外來鍵

在多對多中,如果子表外來鍵多列,那麼父表主鍵也要多列

# 定義:如果一張表中有一個非主鍵的欄位指向了別一張表中的主鍵,就將該欄位叫做外來鍵。
        #如果父表的主鍵是複合主鍵,那麼字表也需要指定兩列對應     constraint fk_fkname foreign key (id1,id2) references table_name(pid1,pid2)
# 父表:外表,主鍵被指向的表, 子表:設定外來鍵的那張表

#普通外來鍵:
    #父表對子表  是1對多

#唯一索引外來鍵:
    #父表對子表  是1對1
    #部落格表對使用者表,一個使用者只有一個部落格
        #比如公司使用者中有個系統
            #使用者表
            #管理表
                #使用者表中只有少數幾個管理崗才能登陸系統
                #所以就在管理表中,設定一個 唯一索引外來鍵 ,把管理者的使用者id 放到管理表中
                #圖在有道詞典181006

#多對多
    # 不要求聯合唯一
            #圖在有道詞典181006  相親使用者表
    #要求聯合唯一
            # 使用者和主機也是多對多,使用者主機關係表中可以 user和hostid可以聯合唯一。
            #有道筆記20181006 mysql

#如果外來鍵要兩列,那麼父表的主鍵也要兩列
外來鍵的變種

 

主鍵的概念,建立,刪除,多列主鍵

# 表中的每一行都應該具有可以唯一標識自己的一列(或一組列)。而這個承擔標識作用的列稱為主鍵。
#   如果沒有主鍵,資料的管理將會十分混亂。比如會存在多條一模一樣的記錄,刪除和修改特定行十分困難。

# primary key:  加速查詢 (保證資料的唯一性),一張表只能有一個主鍵
                #但是一個主鍵可以為一列,或者兩列


#主鍵還可以這麼寫  : 為了能更準確的表示資料唯一性,有時候需要用到複合主鍵
# create table score(sid int not null auto_increment ,
#   number int,
#   student_id int,
#   corse_id int,
#  primary key (sid,student_id) #表示由這兩列設定為一個主鍵
                                #且記得主鍵不能為空
#   constraint fk_sid_student foreign key (student_id) references student(sid),
#   constraint fk_cid_course foreign key (corse_id) references course(cid)
# )engine=innodb default charset=utf8;


#   刪除主鍵:
    # alter table t1 drop primary key;
    # 刪除後建立
          # alter table t1 add primary key(id1);
主鍵

 

資料型別,分成三大類數字型別,字串,時間型別

#分成三大類

#數字型別:
    #bit 二進位制
    #tinyint
    # int
    # bigint
    #float 數值越多越不準確
    #double 數值越多越不準確
    #decimal 小數推薦用這個,但是 decimal(m,d) 這裡的m是指包括小數在內的總位數

# 字串:
    #char  char(10) 不管欄位值多少個,儲存必定是10個位置,但是速度快,因為在搜尋的時候,固定只要每10個,10個位置找就行了,不用顧慮欄位值多大
    #varchar  varchar(10) 比如輸入root,就只佔用4個空間,但是速度慢
         # char(20) 和 varchar(20) 都只能最多儲存20個字元。超過20個字元會自動截掉
         #sql優化手段,建立資料表字段的時候,把定長的放前面用char,類似地址要放最後,採用varchar
    #Varchar(m) 最大位元組65535 可變長度  m取0-65535 只儲存需要字元數,另加一個位元組來宣告長度
    #Char(m)   最大位元組數255  定長型別  m可取0-255 它的右邊填充空格以達到指定長度,當檢索到char值時,尾部的空格被刪除掉
    #text
    #mediumtext
    #longtext
    #如果比longtext還大,就不要用資料庫存了,寫成檔案的格式,然後把路徑存到資料庫
    #對於上傳檔案,要把檔案存硬碟,只把路徑存資料庫
        # 有4種text型別:tinytext、text、mediumtext和longtext。這些對應4種blob型別,有相同的最大長度和儲存需求。
        # blob 列被視為二進位制字串(位元組字串)。
        # text列被視為非二進位制字串(字元字串)。
        # blob列沒有字符集,並且排序和比較基於列值位元組的數值值。
        # text列有一個字符集,並且根據字符集的 校對規則對值進行排序和比較。

#時間型別:
    #datatime

#其他型別:
    #列舉 enum
    #集合 set
    # 集合型別
    # A SET column can have a maximum of 64 distinct members.
    # 示例:
    # CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
    # INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
    # SET 的值,裡面只能填 abcd這四個值的任意組合
資料型別—常用必須記住
#總覽
# 【1】bit[(M)]
#     二進位制位(101001),m表示二進位制位的長度(1-64),預設m=1
#
# 【2】tinyint[(m)] [unsigned] [zerofill]
# 小整數,資料型別用於儲存一些範圍的整數數值範圍:
# 有符號: -128 ~ 127.
# 無符號:0 ~ 255
# 特別的: MySQL中無布林值,使用tinyint(1)構造。
#
# 【3】int[(m)][unsigned][zerofill]
# 整數,資料型別用於儲存一些範圍的整數數值範圍:
# 有符號:-2147483648 ~ 2147483647
# 無符號:0 ~ 4294967295
# 特別的:整數型別中的m僅用於顯示,對儲存範圍無限制。例如: int(5),當插入資料2時,select 時資料顯示為: 00002
#
# 【4】bigint[(m)][unsigned][zerofill]
# 大整數,資料型別用於儲存一些範圍的整數數值範圍:
# 有符號:-9223372036854775808 ~ 9223372036854775807
# 無符號:0  ~  18446744073709551615
#
# 【5】decimal[(m[,d])] [unsigned] [zerofill]
#  準確的小數值,m是數字總個數(負號不算),d是小數點後個數。 m最大值為65,d最大值為30。
# 特別的:對於精確數值計算時需要用此型別decaimal能夠儲存精確值的原因在於其內部按照字串儲存。
#
# 【6】FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
# 單精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。
# 有符號:-3.402823466E+38 to -1.175494351E-38,0,1.175494351E-38 to 3.402823466E+38
# 無符號: 0,1.175494351E-38 to 3.402823466E+38
#  **** 數值越大,越不準確 ****
#
# 【7】DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
# 雙精度浮點數(非準確小數值),m是數字總個數,d是小數點後個數。
# 有符號:-1.7976931348623157E+308 to -2.2250738585072014E-308,0,2.2250738585072014E-308 to 1.7976931348623157E+308
# 無符號:0,2.2250738585072014E-308 to 1.7976931348623157E+308
# **** 數值越大,越不準確 ****
#
#
# 8】char (m)
# char資料型別用於表示固定長度的字串,可以包含最多達255個字元。其中m代表字串的長度。
# PS: 即使資料小於m長度,也會佔用m長度
#
# 【9】varchar(m)
# varchars資料型別用於變長的字串,可以包含最多達255個字元。其中m代表該資料型別所允許儲存的字串的最大長度,只要長度小於該最大值的字串都可以被儲存在該資料型別中。
# 注:雖然varchar使用起來較為靈活,但是從整個系統的效能角度來說,char資料型別的處理速度更快,有時甚至可以超出varchar處理速度的50%。因此,使用者在設計資料庫時應當綜合考慮各方面的因素,以求達到最佳的平衡
#
# 【10】text
# text資料型別用於儲存變長的大字串,可以組多到65535 (2**16 − 1)個字元。
#
# 【11】mediumtext
# A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
#
# 【12】longtext
# A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
#
#
# 【13】enum
# 列舉型別,
# An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
# 示例:
# CREATE TABLE shirts (
# name VARCHAR(40),
# size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
# );
# INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
#
# 【14】set
# 集合型別
# A SET column can have a maximum of 64 distinct members.
# 示例:
# CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
# INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
#
# 【15】DATE
# YYYY-MM-DD(1000-01-01/9999-12-31)
#
# 【16】TIME
# HH:MM:SS('-838:59:59'/'838:59:59')
#
# 【17】YEAR
# YYYY(1901/2155)
#
# 【18】DATETIME
# YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)
#
# 【19】TIMESTAMP
# YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)
資料型別-詳細描述

 

表格的建立,表格的約束:欄位名,資料型別,是否為null,預設值,是否自增,主鍵,以及表格的增刪改查,欄位的操作。

查看錶格結構的兩個語句 show create table table table_name \G;   desc table_name;

#由於我們在 my.ini中已經配置了預設資訊,所以 default資訊可以不用寫
# engine=innodb default charset=utf8
        #mysql中的引擎:
            #innodb:事務功能和行級鎖,比如原子性操作,表示一條操作如果有一部分失敗了,那麼整條操作會回滾
            #myisam: 全域性索引,儲存速度快

#create database 【db名】defalut charset utf8;
#建立表
    #create table table_name(欄位1 型別,欄位2 型別...) default charset=utf8;

        #!!欄位後可以跟 型別,是否null(預設不為空),預設值,auto_increment,primary key
    #create table table_name( 欄位1 型別  null,
                            # 欄位2 型別  not null,
                            # 欄位3 型別 not null default=1,
                            # 欄位3 型別 not null auto_increment primary key...
                            # )engine=innodb default charset=utf8;
    # auto_increment 表示:自增   #與primarykey繫結使用,一張表只能有一個自增  (id int auto_increment primary key,)
    # primary key:  表示 約束(不能重複且不能為空); 加速查詢 (保證資料的唯一性),一張表只能有一個主鍵
    #刪除表: drop table table_name;
        #檢視建立表的語句 show create table table_name;

    #修改欄位型別:
        # alter table t1 change id1 id1 int;

#插入
    #insert into table_name(欄位1,欄位2..) values (列值1,列值2...),(列值1,列值2...) 可插入多行
    #insert into table_name values (列值1,列值2...)要按順序每列都要
    #INSERT INTO uses SET name = '姚明', age = 25; (不好用,還是用上面的)

#檢視
    #select * from table_name where 欄位 = '欄位值';

#清空表:
    # delete from table_name where 欄位 = '欄位值';
    #delete from table_name; 刪除表全部值  #讓id從刪除的項開始自增
    #truncate table table_name;            #id會從最原始開始i自增

#更新:
    #update table_name  set 欄位 = '新欄位值' where 欄位 = '欄位值';

'''
#修改表的列屬性
# alter table 表名 change 原列名 新列名 型別;   --修改表的列屬性名
# alter table 表名 modify 列名 型別 ;          --修改表的類型別
# alter table 表名 drop 列名;                    --刪除表的某一列
# alter table 表名 add  列名 型別;               --新增某一列
# alter table 表名 rename 新表名;                 --修改表名
'''
表格的建立及操作
# Mysql增加主鍵或者更改表的列為主鍵的sql語句

# 新增表字段
    # alter table table1 add transactor varchar(10) not Null;
    # alter table table1 add id int unsigned not Null auto_increment primary key

# 修改某個表的欄位型別及指定為空或非空
    # alter table 表名稱 change 欄位名稱 欄位名稱 欄位型別 [是否允許非空];
    # alter table 表名稱 modify 欄位名稱 欄位型別 [是否允許非空];

# 修改某個表的欄位名稱及指定為空或非空
    # alter table 表名稱 change 欄位原名稱 欄位新名稱 欄位型別 [是否允許非空

# 刪除某一欄位
    # ALTER TABLE mytable DROP 欄位 名;
#
# 新增唯一鍵
    # ALTER TABLE `test2` ADD UNIQUE ( `userid`)

# 修改主鍵
    # ALTER TABLE `test2` DROP PRIMARY KEY ,ADD PRIMARY KEY ( `id` )
#
# 增加索引
    # ALTER TABLE `test2` ADD INDEX ( `id` )

#修改欄位型別,並設定主鍵
    # ALTER TABLE `category ` MODIFY COLUMN `id`  int(11) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`id`);


#建表後建立唯一索引:
#         create unique index UK_student_name on student (name);
# 建表後新增約束
#         alter table student add constraint uk_student_name unique (name);

#1. select now();  列印當前時間

#2. desc table_name; 檢視欄位的屬性
#3. show create table table_name ; 查看錶的建立程式碼
#3. show create table table_name \G ; 豎著看,查看錶的建立程式碼
ALTER命令
# desc table_name; 檢視列的屬性

#自增列的起始值修改:
# show create table table_name \G ; 豎著看,查看錶的建立程式碼
    # 可以看到auto_increment = 數值
    #這個就是自增數列此時下一個要自增的id數
    #修改自增列的值:
            #aler table table_name auto_increment = 你想要的數值;
    #取消自增列:
            #alter table table_name change id id int;

#自增列的步長:
    # 1. mysql : 基於會話級別,一次mysql登陸使用,就是一次會話
        #show session variables like 'auto_inc%'; 檢視步長
        #set session auto_increment_increment=2;  #設定步長
        #set session auto_increment_offset=10;    #設定起始值

            #基於全域性級別的,應用於所有會話所有表,【儘量別使用】
            #shwo global  variables like 'auto_inc%';
            #set global auto_increment_increment=2;
            #set global auto_increment_offset=10;

    #2.sql server: 基於表級別可以在表最後
        #)engine=inndb auto_increment=4,步長=5 default charset=utf8;
自增列步長

自增列步長,起始值的修改

#有道筆記20181006 mysql
#唯一索引  : 看到索引馬上想到是 加速查詢
                #唯一 : 約束,不能重複
                #約束功能: 主鍵,外來鍵

#create table t1( id int auto_increment primary key,
                 # num int,
                 # name char(10),
                 #unique 索引名 (num)  #單列唯一索引
                 #index 索引名 (num)  #建立普通索引
                 #unique 索引名 (num,name) #聯合唯一索引: 不能由兩行一模一樣的 num和name
#

#建表後建立唯一索引:
#         create unique index UK_student_name on student (name);
# 建表後新增約束
#         alter table student add constraint uk_student_name unique (name);
        #要先建聯合索引,乖乖刪除原來的索引,再操作吧
#刪除索引:
        # ALTER TABLE t1 DROP INDEX uq_name;

# ERROR !!! :needed in a foreign key constraint問題
        #要先乖乖刪除外來鍵,才能繼續操作索引


#唯一索引和主鍵的區別:
        #唯一索引 可以為空
        #主鍵 不能為空
唯一索引

 

武老師部落格目錄:http://www.cnblogs.com/wupeiqi/articles/5729934.html