MySQL創(chuàng)建關(guān)聯(lián)表可以理解為是兩個表之間有個外鍵關(guān)系,但這兩個表必須滿足三個條件
創(chuàng)新互聯(lián)建站基于成都重慶香港及美國等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)服務(wù)器托管報價,主機(jī)托管價格性價比高,為金融證券行業(yè)遂寧聯(lián)通機(jī)房,ai人工智能服務(wù)器托管提供bgp線路100M獨享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。
1.兩個表必須是InnoDB數(shù)據(jù)引擎
2.使用在外鍵關(guān)系的域必須為索引型(Index)
3.使用在外鍵關(guān)系的域必須與數(shù)據(jù)類型相似
下面分別建兩個表來說明一下:
Create
TABLE
IF
NOT
EXISTS
`books`
(
`book_id`
smallint(6)
NOT
NULL
auto_increment
COMMENT
‘書籍編號',
`book_name`
char(20)
NOT
NULL
COMMENT
’書名‘,
1.建立用戶信息表
create table userinfo(id int(4) not null primary key, name varchar(20) not null unique key)engine=innodb default charset=utf8;
2.建立好友關(guān)系表
create table friend(uid int(4) not null, foreign key(uid) references
userinfo(id),fid int(4) not null, foreign key(fid) references
userinfo(id),unique key(uid,fid))engine=innodb default charset=utf8;
3.追加測試數(shù)據(jù)(滿足uidfid條件)
insert userinfo values(1111---9999,'namea---namei’);
insert friend values(1111,4444---6666);
insert friend values(5555,6666---9999);
4.查詢好友(5555的好友)
select * from friend where uid=5555 or fid=5555;
+-------+------+
| uid | fid |
+-------+------+
| 1111 | 5555 |
| 5555 | 6666 |
| 5555 | 7777 |
| 5555 | 8888 |
| 5555 | 9999 |
+-------+--------+
5.問題:
5.1.userinfo中的id和name不為null,且不可重復(fù):table設(shè)計可以做到
5.2.friend中的uid和fid均不為null,且都來自于userinfo的id:table設(shè)計可以實現(xiàn)
5.3.(uid,fid)組合不可重復(fù):table設(shè)計可以完成
5.4.好友關(guān)系的表達(dá)時,(1111,5555)和(5555,1111)有冗余,也會出現(xiàn)(1111,1111)這樣的數(shù)據(jù):這個在table設(shè)計實現(xiàn)比較麻煩,需要在程序?qū)用鎸崿F(xiàn),也即增加限制條件uidfid即可
6.結(jié)果:
table設(shè)計達(dá)不到要求,或者較難達(dá)到要求時,可以在程序?qū)用嬗枰詮浹a(bǔ)。
你分別給“評論表”(表A)和“文章表”(表B)建立了一個主鍵,數(shù)據(jù)表是存儲多條記錄,而主鍵是區(qū)分記錄的唯一性的,你將 表A 的主鍵id放到 表B 中作為外鍵(aid),你就已經(jīng)將兩表通過 B表(aid) 建立了一種關(guān)系,就好像母子兩人,因為有血緣關(guān)系,就可以知道一人是另一個人的母親,兩個表有關(guān)系了就可以互相知道了;
B表里有了aid必須是A表中存在的,就像兒子肯定有母親的,所有一文章記錄有評論(aid),那aid就能在A表中找到,找到的這條評論就是這篇文章的評論;
因為文章和評論是一對多的關(guān)系,像LZ那樣文章表冗余就會比較多;個人覺得將文章的主鍵作為評論表的外鍵比較好;
MySQL 提供了多種創(chuàng)建索引的方法:
1) 使用 CREATE INDEX 語句
可以使用專門用于創(chuàng)建索引的 CREATE INDEX 語句在一個已有的表上創(chuàng)建索引,但該語句不能創(chuàng)建主鍵。
語法格式:
CREATE 索引名 ON 表名 (列名 [長度] [ ASC | DESC])
語法說明如下:
索引名:指定索引名。一個表可以創(chuàng)建多個索引,但每個索引在該表中的名稱是唯一的。
表名:指定要創(chuàng)建索引的表名。
列名:指定要創(chuàng)建索引的列名。通??梢钥紤]將查詢語句中在 JOIN 子句和 WHERE 子句里經(jīng)常出現(xiàn)的列作為索引列。
長度:可選項。指定使用列前的 length 個字符來創(chuàng)建索引。使用列的一部分創(chuàng)建索引有利于減小索引文件的大小,節(jié)省索引列所占的空間。在某些情況下,只能對列的前綴進(jìn)行索引。索引列的長度有一個最大上限 255 個字節(jié)(MyISAM 和 InnoDB 表的最大上限為 1000 個字節(jié)),如果索引列的長度超過了這個上限,就只能用列的前綴進(jìn)行索引。另外,BLOB 或 TEXT 類型的列也必須使用前綴索引。
ASC|DESC:可選項。ASC指定索引按照升序來排列,DESC指定索引按照降序來排列,默認(rèn)為ASC。
2) 使用 CREATE TABLE 語句
索引也可以在創(chuàng)建表(CREATE TABLE)的同時創(chuàng)建。在 CREATE TABLE 語句中添加以下語句。語法格式:
CONSTRAINT PRIMARY KEY [索引類型] (列名,…)
在 CREATE TABLE 語句中添加此語句,表示在創(chuàng)建新表的同時創(chuàng)建該表的主鍵。
語法格式:
KEY | INDEX [索引名] [索引類型] (列名,…)
在 CREATE TABLE 語句中添加此語句,表示在創(chuàng)建新表的同時創(chuàng)建該表的索引。
語法格式:
UNIQUE [ INDEX | KEY] [索引名] [索引類型] (列名,…)
在 CREATE TABLE 語句中添加此語句,表示在創(chuàng)建新表的同時創(chuàng)建該表的唯一性索引。
語法格式:
FOREIGN KEY 索引名 列名
在 CREATE TABLE 語句中添加此語句,表示在創(chuàng)建新表的同時創(chuàng)建該表的外鍵。
在使用 CREATE TABLE 語句定義列選項的時候,可以通過直接在某個列定義后面添加 PRIMARY KEY 的方式創(chuàng)建主鍵。而當(dāng)主鍵是由多個列組成的多列索引時,則不能使用這種方法,只能用在語句的最后加上一個 PRIMARY KRY(列名,…) 子句的方式來實現(xiàn)。
建立表時,B表設(shè)置b1為外鍵 對應(yīng)A表主鍵,C表設(shè)置c1為外鍵對應(yīng)B表主鍵 查詢多表連接查詢