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

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