ホームページ >データベース >mysql チュートリアル >MySQL ステートメントで主キーと外部キーを使用する方法
データベース テーブルに、レコードを一意に決定できるフィールドをテーブルの主キー フィールドとして設計できます。
例: 個人の情報テーブル (フィールド: 名前、年齢、出身地、勤務単位など) を作成する場合、ID 番号があなたを識別する唯一の方法です。 , そのため、ID 番号が主キーになります。
主キーフィールド名primary key
原則として、1つのフィールドを使用しますを主キーとして使用し、id などのビジネス上の意味を持たないフィールドを主キーとして使用することをお勧めします。
主キー フィールドのタイプと長さは、主キー値の生成方法:
1.4 によって決まります。 1)
自動インクリメント: データベース独自の主キー生成メカニズムを使用します
数値の長さはデータ量によって決まります
作成: 主キー フィールド名主キーnot null auto_increment
特長:
利点: 簡単に取得できるように自動的に番号を付けて保存できるため、開発効率が高く、占有スペースが少なく、開発者の時間を節約できます。
デメリット: 作業効率が低く柔軟性に欠ける 自動拡張のためID指定のデータを手動で挿入したりインポートしたりするのが面倒 データ量が多すぎるとデータベースが自動的に拡張してしまう時間が長くなり、データベースへのクエリの動作が遅くなります。テーブルをマージする操作がある場合、主キーが重複する可能性があります。
1.4.2)
asighed: プログラマは、唯一の null 以外のアルゴリズムである主キー値を手動で生成します。
hi/low: 数値型の長さが決定されます。データ量に応じて
UUID : 文字列の長さは 32 ビット
public class UUIDUtil {//java中自带UUID的算法 public static String getUUID(){ return UUID.randomUUID().toString().replaceAll("-", ""); } }
機能:
利点: 主キー値の生成は非常に柔軟であり、どのような状況でも一意性を保証できます。データ移行が便利です。
短所:多くのスペースを占有し、覚えるのが難しく、パフォーマンスを減らします。
1.4.4)
結合主キー: 複数のフィールドのタイプと長さによって決定されます
通常、2 つのテーブル間の関係を確立するために使用されます。外部キーの主な目的は、エンティティの 2 つの独立したインスタンス間のデータの整合性を維持することです。
アラート テーブルの主キー テーブル名追加制約 FK_ID (外部キー名)外部キー(外部キーフィールド名)参照 外部テーブル名(主キーフィールド名)
補足:
テーブル作成時に、外部キーが存在する場合があります。テーブル間のビジネス関係(アソシエーション関係)である場合、外部キーが生成されます。
関連関係に存在する関係タイプ:
1 対 1: 1 つのテーブル (A) の 1 つのレコードは別のテーブル (B) の 1 つのレコードにのみ対応し、もう 1 つのレコードは 1 つだけ対応できます。 1 つのテーブル (B) 内のレコードは、1 つのテーブル (A) 内の 1 つのレコードのみに対応できます。
例: ソフトウェア エンジニアリング 2777 クラスと分隊のリーダー、市民権、ID カード。 (商品テーブルと商品説明テーブル)
1対多: 1つのテーブル(A)の1レコードが別のテーブル(B)の複数のレコードに対応し、他のテーブル(Bの1レコード) 1 つのテーブル (A) 内の 1 つのレコードにのみ対応できます。
例: 製品分類表と製品は 1 対多の関係を表します。1 つの製品カテゴリ、学生、クラスの下に複数の製品が存在する可能性があります。
多対多: (テーブルが 2 つあり、テーブル A の 1 つのデータはテーブル B の複数の項目に対応し、同時にテーブル B の 1 つのデータはテーブル A の複数の項目に対応します)
例: customerテーブルと部門テーブル。
関連クエリ (外部キーを使用して複数のテーブルのデータを同時にクエリ)
関連クエリの種類:
内部結合: 条件を満たすすべてのデータをクエリします両方のテーブルに対応するレコードがあります
#左外部結合: 右側のテーブルに対応するレコードがない場合でも、左側のテーブルのすべての修飾されたデータをクエリします右外部結合: 左側のテーブルに対応するレコードがない場合でも、右側のテーブル内のすべての修飾されたデータをクエリします。2.3.1) 1 対多の場合:例: A(1) --------- B (n) Father Watch
TBL_STUDENT TBL_CLASS
ID名 Class_id ID名
1001 ZS 111 Class1
1002 LS 111 222 Class2
1003 ww 222
1004 zl
//查询所有姓张的学生的id,name和所在班级name select s.id,s.name,c.name as className from tbl_student s join tbl_class c on s.class_id=c.id//假如外键不可以为空 where s.name like 'z%'内部接続を使用して、テーブル内に対応するレコードがあります。一致するすべての左テーブルのレコードを取得したい場合は、左外部結合クエリ
を使用できます。
2.3.2)在一对一中:
tbl_person tbl_card
id name id name
1001 zs 1001 card1
特点:
a)共享主键:(不推荐)
添加数据:先添加先产生的表,再后产生的表记录
删除数据:先删除后产生的表记录,再删除先产生的表记录
查询数据:无需进行连接查询:
//查询zhangsan的驾照信息 1001 select * from tbl_card where id='1001'
2.3.3)多对多:
tbl_student tbl_course
id name id name
1001 zs 111 java
1002 ls 222 mysql
tbl_student_course_relation
student_id course_id
1001 111
1001 222
1002 111
1002 222
特点:
添加数据时,先添加父表记录(tbl_student,tbl_course),再添加子表(tbl_student_course_relation)记录;
删除数据时,先删除子表记录(tbl_student_course_relation),再删除父表记录(tbl_student,tbl_course)
查询数据时,可能会进行关联查询:
//查询所有姓张的学生的id,name,和所选课程的name select s.id,s.name,c.name as courseName from tbl_student s join tbl_student_course_relation scr on s.id=scr.student_id join tbl_course c on scr.course_id=c.id where s.name like 'z%'
以上がMySQL ステートメントで主キーと外部キーを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。