1.外部キー:2つのテーブル間の関係を確立するために使用
-多くの
-多くの多くに
- 1
テーブルとテーブルの間の関係を研究:
1.部門の従業員表の定義
ID、氏名、性別、dep_name、 dep_descを
-すべてのデータは、欠点のテーブルに格納されている:
1.構造が明らか--->非致死ではない
空間の2廃棄物--->致死
3.スケーラビリティが悪い--->欠点を無視することはできない
-などのファイルに保存されているすべてのPYのPythonコード、強い結合一緒に----> ----分離型>分割テーブル
- スプリット上記の問題を解決するためのテーブル。
- 2つのテーブル間の「外部キー」の使用との間に強い関係を確立する必要があります
-どのように!!!!! ******確認は、テーブルとテーブルの間の関係は(ある多くの1つは、多くの多くの、一から一)
- 注:2つのテーブル間の関係を確立するために、立たなければなりません2つの場所に考えるように:
-従業員のテーブルの場所:複数の従業員が部署に対応できますか?ことができます!
- 従業員や部門:多くの
- フォームテーブルに多くの部門の従業員
複数の部門が従業員に対応することができます: - 部門表の位置を立って?することはできません!
概要:多くのツーテーブル関係の任意の方法で、外部キー関係の多くと呼ばれます。
-外部キー:構文:外部キー(現在の関係テーブルの外部キーフィールド)の参照は、テーブル名(ID)と関連しています
- 多くの
#2のテーブル作成
1.を、その後、関連テーブルの最初の関連付けテーブルを確立する必要があります
#被关联表: DEP: 表DEP(作成 主キーAUTO_INCREMENT INT ID、 dep_nameのVARCHAR( 16 )、 dep_desc VARCHAR( 255 ) )。 #关联表: EMP: emp表(作成 ID int型主キーのAUTO_INCREMENT、 名前のVARCHAR( 16 )、 年齢int型、 性別列挙型を(' 男性'、' 女性'、' 他者')デフォルトの' 男性' 、 dep_id int型ではないnullを、 外部キー(dep_id)参照のDEP(ID) );
注:MULの外部キーのKEY代表
#挿入データ:
-図1は、データ関係テーブル(DEP)に挿入し、次にアソシエーションテーブル(EMP)データに挿入されなければなりません。
#DEP: INSERT INTO DEP(dep_name、dep_desc)の値(' 外務省のNb_省'、' 国際大使部門' )、 (' Sb_教育課'、' プログラマー部門を作る!!!! ' )、 (" 技術' ' 技術限ら部門' ); #EMP: INSERT INTO EMP(名前、年齢、性別、dep_id) の値(' 戦車 '17、。 ' 男性'1。)、 ('ジェイソン '70 ' 男性'2)、 (' ショーン '50、 ' 男性'2)、 (' エゴン '88 ' 男性'2)、 (' オーウェン '95 ' 女性'、3 ); #报错、 EMPへの挿入(名前、年齢、性別、dep_id)の値(' 大饼'、100、"、999)。
- (関連するデータと共に変化する)カスケード更新とカスケード削除
-更新カスケードに
- ON DELETE CASCADEを
- テーブルを作成します。
#被关联表: DEP2: 表DEP2(作成 主キーAUTO_INCREMENT INT ID、 dep_nameのVARCHAR( 16 )、 dep_desc VARCHAR( 255 ) )。 #关联表: EMP2: テーブルEMP2を作成します( 主キーAUTO_INCREMENT int型のID、 名前のVARCHAR( 16 )、 年齢int型、 性別列挙型(' 男性'、' 女性'、' 他者')デフォルト' 男性'、 dep_id int型ではないnullで、 外部キー(dep_id)参照のDEP2(ID) 更新カスケードの 削除カスケード上 )。
- 挿入データ
#DEP: INSERT INTOのDEP2(dep_name、dep_desc)の値( '外務省のNb_省' 、'国際大使部門' )、 (' Sb_教育課'、' プログラマー部門を作る!!!! ' )、(" 技術' ' 技術限ら部門' ); #EMP: INSERT INTO EMP2(名前、年齢、性別、dep_id) の値(' 戦車 '、17、 ' 男性 '、1 )、 (' ジェイソン '70、 ' MALE "、2)、 (' ショーン'、50、' 男性'、2 )、 (' エゴン'、88 ' 男性'、2 )、 (' オーウェン'、95 ' 女性'、3 ); #报错 EMPへの挿入(名前、年齢、性別、dep_id)の値(' 大饼'、100、' 他人'、999);
- データの更新やデータの削除
- 更新は、レコード の更新が言及ID上にSETをDEP2 = 200 WHERE上記ID = 1 ; - 削除レコード の削除から DEP2 WHERE上記ID = 200。
カスケード、データは200の変更に関連するので
注:MySQLは唯一の多くの、多くのではありません
- 多くの多くの
我々はまた、二つのテーブルの位置を考えるように立たなければなりません。
- デモンストレーションエラー:
#- 创建book表 create table book( id int primary key auto_increment, title varchar(20), price int, book_content varchar(255), author_id int, foreign key(author_id) references author(id) on update cascade on delete cascade ); #- 创建author表 create table author( id int primary key auto_increment, name varchar(16), age int, book_id int, foreign key(book_id) references book(id) on update cascade on delete cascade );
- 问题: 无法知道哪张表是被关联表
- 利用第三张表,为两张表建立“多对多外键关系”。
#-book: create table book( id int primary key auto_increment, title varchar(20), price int, book_content varchar(255) ); #-auther: create table author( id int primary key auto_increment, name varchar(16), age int ); #-book2author: create table book2author( id int primary key auto_increment, book_id int, author_id int, foreign key(book_id) references book(id) on update cascade on delete cascade, foreign key(author_id) references author(id) on update cascade on delete cascade );
- 插入数据
#- book insert into book(title, price, book_content) values ('金瓶mei', 199, '讲述朦胧时光的小故事'), ('python从入门到断气', 2000, '学习如何一夜秃头'), ('三体', 200, '跟着大佬进入宇宙奇幻世界') ; - author insert into author(name, age) values ('egon', 68), ('jason', 88); - book2author: insert into book2author(book_id, author_id) values (1, 1), (1, 2), (2, 2), (3, 1); # 报错, 插入的数据,book_id, author_id必须存在 insert into book2author(book_id,author_id) values(4, 4); # 更新或删除 #更新 update book set price =666 where id =1; update book set id=4 where id=1; #删除 delete from book where id=4; (会删除关联表内容)
- 一对一:
- user_info:
id, name, age, gender, hobby, id_card
- user:
id , name, age, detail_id(外键)
- detail:
id, gender, hobby, id_card
user与detail表建立了 一对一的外键 关系。
foreign key 应该建在 使用频率较高的一方。
-创建表
#被关联表 create table customer( id int primary key auto_increment, name varchar(16), media varchar(32) ); #关联表 create table student( id int primary key auto_increment, addr varchar(255), phone_char(11), id_card char(18), # 外键必须设置成唯一的 customer_id int unique, forign key(customer_id) references customer(id) on update cascade on delete cascade );
- 插入数据
insert into customer(name,media) values ('hcy','facebook'), ('zsb1','ig'), ('zsb2','vk'), ('hb','探探'); insert into student(addr,phone,id_card,customer_id) values ('上海', '15214546711', '440888888888888888', 1), ('北京', '18888888888', '440777777777777777', 2); # 报错,一对一,关系必须 一一对应 insert into student(addr, phone, id_card, customer_id) values ('上海', '15214546711', '440888888888888888', 1); - 插入数据: insert into
修改表的操作
- 语法: 注意: mysql 关键字不区分大小写
1. 修改表名
ALTER TABLE 表名 RENAME 新表名;
2. 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…],ADD 字段名 数据类型 [完整性约束条件…]; # 添加到最后一列
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 添加到第一列
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 添加到某一列之后
3. 删除字段
ALTER TABLE 表名 DROP 字段名;
4. 修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; # 修改数据类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; # 修改字段名,保留字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; # 修改字段名与字段类型
- 复制表的操作:
复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;
只复制表结构
# 将select * from service where 1=2; ---> 不要真实数据,需要表结构
mysql> create table new_customer select * from customer where 1=2;