程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> Mysql入門基礎 數據庫創建篇

Mysql入門基礎 數據庫創建篇

編輯:關於MYSQL數據庫
1.創建數據表---基礎(高手跳過)
正統方法:create [TEMPORARY] table 表名 [if not exists]
(創建的列項定義)
[表的選項]
[分區的選項];#正統的創建方式,具體的參數,請參考mysql手冊,在這裡不做詳細的解釋,只說一些比較特別的。
例:
復制代碼 代碼如下:
create table user(id int unsigned not null auto_increment,
username char(15),
sex enum('M','F') default 'M',
userid varchar(20),
PRIMARY KEY(id,userid),
INDEX idx_user(userid),
)engine='innodb' charset=utf8;

復制數據庫結構:
復制代碼 代碼如下:
create [temporary] table 表名 [if not exists] like 已存在的表名;//模仿已存在的表創建一個結構完全相同的表
mysql>create table vip_user like user;
mysql>create table vip_user select * from user where 0;//上例還可以這樣做,僅復制結構

復制並copy數據庫
復制代碼 代碼如下:
create [temporary] table 新表名 select * from 舊表名;#用戶可以人為的指定後續select組合成需要的語句。
create table dst_tbl(
id int not null auto_increment,
primary key(id)
) select a,b,c from src_tbl;

以此來創建各種各樣的符合用戶要求的數據庫,這裡只是做一個拋磚引玉。
2.查看修改的數據表結構
復制代碼 代碼如下:
mysql> desc 數據表名;#查看數據表的結構
mysql> show create table 數據表名\G #查看數據表的構成語句,\G和;的意義相同,只不過\G是縱向顯示,這樣看的更清楚。
mysql> show table status like '數據表名'\G #查看數據表的狀態
mysql> show columns from 數據表名;#查看數據表的結構,同desc一樣,不過使用這條語句後面加like '字段'可以只顯示指定字段

3. 更改變據庫的結構
我們首先創建一個表
mysql> create table vip(id int null,username varchar(30));
修改表結構中的數據類型
復制代碼 代碼如下:
mysql>alter table vip modify id smallint default 1;#更改數據記錄為1.
mysql>#alter table vip modify id smallint auto_increment;#大家執行一下這句話會提示錯誤,因為mysql中要求自動增長的列設為主鍵
mysql>alter table vip add primary(id);#設vip中的值的主鍵為id,執行這條語句後再執行上面的就沒問題了。
mysql>alter table vip modify username char(30) not null;#改變vip的username為char(30);
mysql>alter table vip modify username mediumtext first; #改變vip中的username,並將它設在最前面字段,還有一個是after 字段,是指放在某字段後

對已有表新增字段
mysql> alter table vip add sex enum('M','F') default 'M' not null after id;#新增sex字段為enum類型,放在id的後面.

對已有字段改名
mysql>alter table vip change sex usersex tinyint default 0 not null after username;改名字段sex為usersex並改變類型和位置。
注:僅alter中modify,change很相似,但是modify不能改名只能改結構,但change即可以改名,也可以改類型。

刪除字段
mysql>alter table vip drop usersex;#刪除 usersex字段,警告,所有的該字段數據都會丟失。
數據庫改名
mysql>alter table vip rename to vip_user;數據庫進行改名。
改變數據表引擎
mysql>alter table vip engine="MyISAM";

注意,修改數據結構是一個很危險的事,最好做好備份,以防不側。
還有部分的alter的語句和技巧我們將在以後涉及處一一到來.....
4. 關於數據約束
數據約束在mysql5中支持的越來越好了,但是現有的數據約束僅限於innodb,傳說中mysql5.2也會支持對數據約束的支持(期待..)
首先我們了解一下什麼是數據約束,因為我們平常創建表中都可能會有互相關聯的信息,而數據約束是將兩個表進行關聯的一種紐帶。
例如:兩個表,一個usertype,一為userid,usertype中有一個關鍵字key為用戶類型編號,userid表中也有一 user_key對應著usertype表中的
1.首先我們要保證userid表中的所有值都在usertype中
2.其次我們要保證usertype中的值key進行改變userid表中的user_key值也會變化。
3.usertype中的值不能隨意刪除,除非userid表中不存在該usertype類型的值,如果要強制刪除則會刪除userid中的所有 usertype的值。
如果沒有數據約束,我們每次insert/update可能要用數條語句才能保證數據的正確完整性,如果使用數據約束則只需要在定義的時候進行一下處理,而不用擔心太多。而且最重要的是使用數據約束能夠很好的保證數據,業務的完整性。
呵呵,說了這麼多,還沒有說數據約束的缺點:慢,使用數據約束要比不使用數據約束慢得多,而且用戶每次插入數據或更改數據,數據庫系統都會花一定的時間進行一定的檢查.但是隨著 mysql的日益成熟,這種速度會有著很大的改進。
就個人而言,我覺得非商務、實時系統對數據業務完整性要求較高的情況下使用數據約束還是很有必要的。其它情況下就仁者見仁智者見智了。

5.數據約束簡明解析
所以外鍵的定義必須必須滿足以下三種情況:
1.兩個表必須是innodb表類型
2.指定為外鍵的列必須進行索引
3.兩個表中關聯的外鍵類型必須相符。
我們先來看例子,在例子中進行學習:
mysql> create table parent(id int null,primary key(id)) engine=innodb; #創建一個主表
mysql> create table child(id int,parent_id int,
foreign key(parent_id)
references parent(id) on delete restrict on update cascade
) engine=innodb; #創建一個從表,並約外鍵關鍵字為parent_id,建立之間的關聯關系。
mysql> insert into parent values(1),(2),(3);#對主表插入數據
mysql> insert into child values(1,1),(1,2),(1,3);#對子表進行插入數據,對應不同的parent_id子child的id值均為1;
mysql> #insert into child values(1,1),(1,2),(1,3),(1,4); #看一下這會發生什麼?報錯是吧?什麼原因?大家想想
說明:因為我們在創建語句的時候就約定了數據是進行外鍵關聯的,而parent中不存在id值為4的主鍵,那麼子鍵當然更新不了了。
這時數據庫中的值為:
parent child
id id parent_id
1 1 1
2 1 2
3 1 3
我們繼續操作以體現外鍵關聯表的作用
mysql> update parent set id=4 where id=1;#改變parent的值看一下child的反應
mysql> select * from parent;
mysql> select * from child;
這時數據庫中的值為:
parent child
id id parent_id
2 1 4
3 1 2
4 1 3
通過以上的例子大家可以清楚的看到用戶只是改變parent的值,而關聯的child值會自動改變。我們繼續
mysql> insert into child values(2,4),(3,4),(4,4);#為子表再添加一些其它的值。
mysql> #delete from parent where id=4; #大家執行這條語句看一下有什麼結果,錯誤吧?我們來分析一下提示錯誤
我們回顧一下我們創建外鍵的說細情況和關鍵語句:
foreign key(parent_id) #這句話的意思是指定對外關聯鍵為本表的parent_id;
references parent(id) on delete restrict on update cascade#這句話是則約束語句,references可以約束本數據庫的外鍵即parend_id與 parent數據表的id子鍵對應,並約束了on delete,on update時的操作,mysql共有以下幾種操作:
(1) restrict、no action 表示如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作 ,大家現在明白了吧?為什麼我們執行delete from parent where id=4;時出現錯誤,因為子表(child)中還存在值.
(2) set null 在父表上update/delete記錄時,將子表上匹配記錄的列設為null,但要注意子表的外鍵列不能為not null
(3) cascade 在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄
大家可以根據自己的需要設置不同的動作,例如,我們要在父表刪除時,自動刪除子表的關聯值,則我們需進行設置:
references parent(id) on delete cascade on update cascade,實驗之前我們須要知道
1.已經定義設置好的外鍵是無法再行更改的,必須要刪除外鍵後再行創建(可能還有別的方法,哪位高手指點一下)
mysql> show create table child/G #得到 constraint(約束)的名字
說明:constraint是可以缺省的,用於指定約束的名字,如果不指定則系統會自動為它取名,例如我們可以這樣:
constraint fk_child_key
foreign key(parent_id)
references parent(id) on delete restrict on update cascade;
這樣我們就指定了這個約束的整體名稱為fk_child_key,以後可以對這個進行操作了.
mysql> alter table child drop foreign key fk_child_key;#刪除約束
mysql> alter table child add foreign key ('parent_id)
references parent(id) on delete cascade
on update cascade;
mysql> show create table child/G #至此約束已更改,用戶可以查看一下更改情況

mysql>delete from parent where id=4;#我們再執行上面的那句,這時沒錯誤了吧?
mysql>select * from parent;
mysql>select * from child; #我們可以看到現在與parent_id為4的全部刪除。呵呵,以後都可以方便的使用了
這時數據庫中的值為:
parent child
id id parent_id
2 1 2
3 1 3
6.數據約束 的額外說明
如果定義了數據約束,則數據的插入或更改速度會很慢,特別是更改數據結構,插入數據時,效率低的可怕。
當客戶執行load data(載入數據,後續會介紹),alter table時建議使用以下命令,暫時關閉數據約束,等完成後再開啟,這樣速度至少可以提升20倍以上。
mysql> set foreign_key_checks=0;#關閉數據約束
mysql> load data infile '文件絕對地址' into table 表名;#從文本文件中載入大量數據
mysql> set foreign_key_checks=1;#打開數據約束
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved