ホームページ >データベース >mysql チュートリアル >MySQL ステートメントで主キーと外部キーを使用する方法

MySQL ステートメントで主キーと外部キーを使用する方法

WBOY
WBOY転載
2023-06-03 12:14:022993ブラウズ

    1. 主キー:

    1.1) 主キー フィールド定義:

    データベース テーブルに、レコードを一意に決定できるフィールドをテーブルの主キー フィールドとして設計できます。

    例: 個人の情報テーブル (フィールド: 名前、年齢、出身地、勤務単位など) を作成する場合、ID 番号があなたを識別する唯一の方法です。 , そのため、ID 番号が主キーになります。

    1.2) 作成:

    主キーフィールド名primary key

    1.3) 主キーの選択原則;

    原則として、1つのフィールドを使用しますを主キーとして使用し、id などのビジネス上の意味を持たないフィールドを主キーとして使用することをお勧めします。

    1.4) 主キー値の生成方法:

    主キー フィールドのタイプと長さは、主キー値の生成方法:

    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.1) 外部キー定義 :

    通常、2 つのテーブル間の関係を確立するために使用されます。外部キーの主な目的は、エンティティの 2 つの独立したインスタンス間のデータの整合性を維持することです。

    2.2) 外部キー (制約) の作成 (推奨されません。通常、外部キー制約はなく、外部キー規則のみ):

    アラート テーブルの主キー テーブル名追加制約 FK_ID (外部キー名)外部キー(外部キーフィールド名)参照 外部テーブル名(主キーフィールド名)

    2.3) 外部キーの出現:

    補足:
    テーブル作成時に、外部キーが存在する場合があります。テーブル間のビジネス関係(アソシエーション関係)である場合、外部キーが生成されます。

    関連関係に存在する関係タイプ:

    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 ステートメントで主キーと外部キーを使用する方法

    以上がMySQL ステートメントで主キーと外部キーを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。