標籤:nav input ide submit 密碼 open from fetch .com
mysql 連表操作之 一對多 外鍵
要完成下面的情況,A中partment中的1都屬於研發部,2屬於開發部,讓兩張表產生聯絡
nid name email partment1 aa [email protected] 12 bb [email protected] 13 vv [email protected] 14 dd [email protected] 2
建立一張表A
nid caption1 研發部2 開發部
另一張表B
A中partment中的1都屬於研發部,2屬於開發部。A和B就是一種關聯。A對B就有約束力,即B中如果添加一條A中沒有的資料,那麼就會報錯A中的外鍵就是B中的主鍵
資料庫表一對多有如下特點:
外鍵就是另一張表的主鍵,注意這裡的外鍵和主鍵必須是同一樣的類型認為建立關聯並且有約束
View Code二、navicat建立外鍵
建立外鍵
1、首先建立兩張表單
建立表B作為內容,讓nid遞增
建立第二張表A注意這裡的主鍵類型要和上一張的外鍵的類型要一樣
2、在B中建立外鍵,設計表,注意前面欄位是B中要設定的外鍵,後面的參考欄位是A中的主鍵
3、首先在A中填寫主鍵和內容,之後再在B中填寫外鍵
在B中填寫內容
這樣就完成了外鍵的建立
三、通過命令建立外鍵
create table part1(nid int not null auto_increment primary key,caption varchar(32) not null );
建立表一
create table person1(nid int auto_increment not null,name varchar(32) not null,email varchar(32) not null,part1_nid int not null,PRIMARY KEY (nid),CONSTRAINT fk_person1_part1 FOREIGN KEY (part1_nid) REFERENCES part1(nid));
建立表二、並且建立外鍵
CONSTRAINT fk_person1_part1 FOREIGN KEY (part1_nid) REFERENCES part1(nid)fk_person1_part1:這個是自訂的名字FOREIGN KEY (part1_nid):設定關鍵外鍵REFERENCES part1(nid):設定關聯另一張表的主鍵
注意四、方法
alter table 從表 add constraint 外鍵名稱(形如:FK_從表_主表) foreign key 從表(外鍵欄位) references 主表(主鍵欄位);刪除外鍵:alter table 表名 drop foreign key 外鍵名稱如:alter table person1 drop foreign key fk_person1_part1; 刪除了建立的外鍵alter table person1 add constraint fk_person1_part1 foreign key(part1_nid) references part1(nid);建立了外鍵
1、添加外鍵
問題:如何在part中拿到ceo所有人的名字?思想:列出B中的名字,和A中要尋找的職位,在B和A組合的合集中讓B中的外鍵和A中的主鍵相關聯,在A中的職位做對照mysql> select B.name,A.captionfrom B left join A on B.partment=A.nidwhereA.caption="CEO";+------+---------+| name | caption |+------+---------+| aa | CEO || bb | CEO |+------+---------+2 rows in set (0.01 sec)
2、連表五、連表:
1、連單個表
a(外鍵) left join b(主鍵) on a.xx=b.xx以a為主,將a中所有的資料羅列出來對於b則顯示於a相對應的資料b(主鍵)) left join a(外鍵)on a.xx=b.xx這樣的則和上面的相反a(外鍵) right join b(主鍵) on a.xx=b.xx以B為主,以A為輔,將B中的資料羅列出來a inner join b on a.xx=b.xx自動忽略未建立關係的資料
2、串連多個表
如果在外鍵這個表中有資料,然後系想再建立一個鏈表,串連一個主鍵的表,這個時候在外鍵這個表建立外鍵的時候要允許這個值為空白,
不然串連主鍵會報錯ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails
ELECT persion.nid as pid, persion.name as pname, part.caption as cp, corlor.title as titleFROM persionLEFT JOIN part on persion.part_nid=part.nidLEFT JOIN corlor on persion.color_id=corlor.nidWHERE part.caption="CEO" and corlor.title="red"(解析:上面展示出pid pname cp title 從(persion和part中的persion.part_nid=part.nid以及persion和color中的persion.color_id=color.nid)的資料)
View Code
六、連表操作之多對多
多對多思想:建立第三種表。然第三張表中的外鍵分別對應前兩張表的主鍵A:1 aa2 bb3 ddB1 a2 b3 c如何讓A和B之間能夠選擇多個呢?CA的ID B的ID1 21 12 22 1 上面就是A中的1對應B中的1和2
View Code
分別在這三張表中插入資料-- INSERT INTO man(name) values("xxoo")-- INSERT INTO woman(name) values("xxoo")INSERT INTO man_to_woman(man_id,woman_id) VALUES(1,2)這裡建立man表
下面woman表
第三張表
需求:找到aa所對應B中的內容
SELECT * from man_to_woman LEFT JOIN man on man_to_woman.man_id=man.nidLEFT JOIN woman on man_to_woman.woman_id=woman.nidWHERE man.name="a"
七、sql注入
如果下面代碼中用的字串拼接,隨便輸入下面內容pyrene ‘ – a aad ‘ or 1=1 – d a就會登入成功出現了上面的原因是因為後台做了字串拼接,這個是所有語言中都會出現的問題
注入原理
pymysql裡面其實已經做了一部分處理直接用cursor.execute(“select name from userinfo where name=’%s’ and password=’%s’”,(username,pwd)),這樣能防止sql注入原因是因為pysql在裡面做了去掉 (’)引號和後面特殊字元的作用:select name from userinfo where name=‘‘ad \‘ or 1=1 -- a‘‘ and password=‘‘a‘‘
pymysql防sql注入原理
下面是pymysql登入註冊代碼
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title></title></head><body> <form action="/index" method="post"> <input type="text" name="username" placeholder="使用者名稱"/> <input type="text" name="password" placeholder="密碼"/> <input type="submit"/> </form></body></html>
前端代碼
#/usr/bin/env pythonimport tornado.ioloopimport tornado.webimport pymysqlclass loginHandler(tornado.web.RequestHandler): def get(self): self.render("index.html") def post(self,*args,**kwargs): username=self.get_argument("username") pwd=self.get_argument("password") conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="123456",db="db1") cursor=conn.cursor() # temp="select name from userinfo where name=‘%s‘ and password=‘%s‘" %(username,pwd) # #做了字串拼接 # print(temp) # effect_row=cursor.execute(temp) #上面是因為字串拼接造成了能夠sql注入 effect_row=cursor.execute("select name from userinfo where name=‘%s‘ and password=‘%s‘", (username,pwd)) #如果匹配下面就登入成功 result=cursor.fetchone() conn.commit() cursor.close() conn.close() if result: self.write("登入成功") else: self.write("登入失敗")settings = { ‘template_path‘: ‘views‘, ‘static_path‘:‘static‘,}# 下面第一個參數是HTML中的參數映射application = tornado.web.Application([ (r"/index", loginHandler),], **settings)if __name__ == "__main__": application.listen(8000) tornado.ioloop.IOLoop.instance().start()
後台代碼:
mysql(二)