ホームページ >データベース >mysql チュートリアル >分析例 MySQL 制約の知識ポイント

分析例 MySQL 制約の知識ポイント

WBOY
WBOY転載
2022-07-14 17:12:302465ブラウズ

この記事では、mysql に関する関連知識を提供します。主に制約に関連する問題が整理されています。制約とは、データの整合性を確保することです。データの整合性とは、データの精度と精度を指します。信頼性は、データベース内に意味規定に従わないデータが存在することを防ぎ、誤った情報の入出力による不正な操作やエラーメッセージを防ぐことを提案したものですので、一緒に見ていきましょう。みんな。

分析例 MySQL 制約の知識ポイント

推奨学習: mysql ビデオ チュートリアル

1. 制約の概要

1.1 制約が必要な理由 -・データの完全性を確保するために

データの完全性(Data Integrity)とは、データの正確さ(Accuracy)と信頼性(Reliability)を指します。データベース内に意味規定に従わないデータが存在することを防ぎ、誤った情報の入出力による不正な操作やエラーメッセージを防ぐことを提案する。

データの整合性を確保するために、SQL 規範が制限するのは、 テーブルデータには追加の条件制限が適用されます 。次の 4 つの側面を考慮してください。

エンティティの整合性 ) : たとえば、同じテーブル内に同一で区別できない 2 つのレコードを存在させることはできません。

ドメインの整合性 (ドメインの整合性) ) : 例: 年齢層 0-120 、性別範囲 」 男 / 女性 「

参照整合性 ) : 例: 従業員がいる部門。この部門は部門テーブルで見つかる必要があります。

ユーザー定義の整合性 (ユーザー - 定義された誠実さ ) : 例: ユーザー名は一意である、パスワードを空にすることはできない、など。この部門のマネージャーの給与は、この部門の従業員の平均給与の 5% を超えてはなりません。 回。

1.2 制約とは - テーブル内のフィールドの制限

制約はテーブル レベルでの必須の規制です。

許容可能 テーブルの作成時に制約を指定します ( テーブルの作成 ​ 声明) 、または テーブル作成後に渡される 他の机 発言規定

制約 。

1.3 制約の分類

制約データ列の制限に従って、 制約は次のように分類できます。

単一列制約 : 各制約は 1 つの列のみを制約します

複数列の制約 : 各制約はデータの複数の列を制約できます

制約の範囲に従って 、制約は次のように分類できます。

列レベルの制約 : 列の定義に従い、1 つの列にのみ適用できます。

テーブルレベルの制約 : 複数の列に適用できます。列と一緒にではなく、個別に定義できます。

列の背後にある構文はサポートされていますが、外部キーは効果がありません。 .できません#

制約の役割による 、制約は次のように分割できます:

1. NOT NULL 非ヌル制約。特定のフィールドを空にできないことを規定します。

2. UNIQUE 一意制約。特定のフィールドがテーブル全体で一意であることを規定します。

3. PRIMARY KEY 主キー (非 null および一意) 制約

4. FOREIGN KEY 外部キー制約

5. CHECK チェック制約

6. DEFAULT デフォルト値制約

注: MySQL は check 制約をサポートしていませんが、 # を使用できます。 ##check影響のない制約

テーブルの既存の制約を表示:

# information_schema データベース名 (システムライブラリ)

# table_constraints テーブル名 (各テーブルの制約を特別に保存します)

## SELECT * FROM information_schema.table_constraints

WHERE テーブル名 = 'テーブル名 ';

2. 非 null 制約 (NOT NULL)

2.1 関数

# 特定の列の値を空にすることはできません

2.2 キーワード

NOT NULL

2.3 機能

1. デフォルト、すべて値のタイプは、

INTFLOAT、その他のデータ型を含む、NULL にすることができます。 ## 2. 非 null 制約は、テーブル オブジェクトの列にのみ指定できます。特定の列のみを独立して非 null として修飾でき、非 null を組み合わせることはできません。

(列レベルの制約のみ、テーブルレベルの制約はありません)

3. テーブルには、それぞれ非 null に制限される多くの列を含めることができます。

4. 空の文字列 ''NULL

0 と等しくありません。 NULL と等しくありません 2.4 非 null 制約を追加します2.4.1 非 null 制約を追加しますCREATE TABLE 時の制約 文法形式:

        CREATE TABLE 
   表名称( 
  
                字段名 数据类型, 
  
                字段名 数据类型 NOT NULL, 
  
                字段名 数据类型 NOT NULL 
  
        );

例:

##2.4.2 ALTER TABLE

時に非 null 制約を追加する 構文形式:

        
alter table 
表名称 
modify 
字段名 数据类型 
not 
null
;

例:

2.5 删除非空约束

语法格式:     

        1.alter table 
   表名称 modify 字段名 数据类型 NULL; #去掉not null,相当于修改某个非注解字段,该字段允 许为空 
  
        2.alter table 表名称 modify 字段名 数据类型; #去掉not null,相当于修改某个非注解字段,该字段允许为空

举例:

3. 唯一性约束(UNIQUE 或 UNIQUE KEY)

3.1 作用

        用来限制某个字段/   某列的值不能重复。  

3.2 关键字

        UNIQUE

3.3 特点

        1.同一个表可以有多个唯一约束。

        2.唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。

        3.唯一性约束允许列值为空。并且允许存在多个NULL值。

        4.在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。

        5.MySQL会给唯一约束的列上默认创建一个唯一索引。

3.4 添加唯一约束

3.4.1 在CREATE TABLE 时添加唯一约束

语法格式:

        1.列级约束

        create table 
   表名称( 
  
        字段名 数据类型, 
  
        字段名 数据类型 unique, 
  
        字段名 数据类型 unique key, 
  
        字段名 数据类型 
  
        );

          2.表级约束  

        create table 
   表名称( 
  
        字段名 数据类型, 
  
        字段名 数据类型, 
  
        字段名 数据类型, 
  
        [constraint 约束名] unique key(字段名) 
  
        );

举例:

 

3.4.2 在ALTER TABLE 时添加唯一约束

语法格式:

          1. alter table 表名称
            add  [constraint 约束名] unique key(字段列表);
        2. alter table 表名称
            modify 字段名 字段类型 unique;

注:字段列表中如果是一个字段,表示该列的值唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的   

举例:  

3.4.3 添加复合唯一性约束

语法格式:

        1.在  create table 时添加复合唯一约束

                create table 表名称( 
  
                字段名 数据类型, 
  
                字段名 数据类型, 
  
                字段名 数据类型, 
  
                 [constraint 约束名] unique key(字段列表) 
  
                );

        2.  在 alter table 时添加复合唯一约束   

                alter table 表名称 
    
                add  [constraint 约束名] unique key(字段列表);

        字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多    

个字段的组合是唯一的     

举例:  

 

 

3.5 删除唯一约束

        1.添加唯一性约束的列上也会自动创建唯一索引。  

        2.删除唯一约束只能通过删除唯一索引的方式删除。  

        3.删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。  

        4.如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;  

           如果是组合列,那么默认和() 中排在第一个的列名相同。  

           也可以是自定义唯一性约束名。    

语法格式:

        ALTER TABLE USER 
  
        DROP INDEX 约束名;

查看表从索引:    

        show index from 表名称
     ;

举例:  

4. PRIMARY KEY 约束(主键约束)

4.1 作用

        用来唯一标识表中的一行记录。    

4.2 关键字

        primary key    

4.3 特点

        主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。  

        1. 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。  

        2. 主键约束对应着表中的一列或者多列(复合主键)  

        3. 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。  

        4. MySQL的主键名总是    PRIMARY    ,就算自己命名了主键约束名也没用。  

        5. 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的    主键索引    (能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。  

        6. 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性   

4.4 添加主键约束

4.4.1 在CREATE TABLE 时添加主键约束

语法格式:   

           1.列级模式  

                create table 表名称( 
  
                字段名 数据类型 primary key, #列级模式 
  
                字段名 数据类型, 
  
                字段名 数据类型 
  
                );

        2.表级模式(注:    MySQL的主键名总是    PRIMARY    ,就算自定义了主键约束名也没用    )  

                create table 表名称( 
  
                字段名 数据类型, 
  
                字段名 数据类型, 
  
                字段名 数据类型, 
  
                [constraint 约束名] primary key(字段名) #表级模式 
  
                );

举例:  

4.4.2 在CREATE TABLE 时添加复合主键约束

        多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。

语法格式:

        create table 
    表名称( 
  
        字段名 数据类型, 
  
        字段名 数据类型, 
  
        字段名 数据类型, 
  
        primary key(字段名1,字段名2) 
  
        );

字段1和字段2的组合是唯一的,也可以有更多个字段   

举例:   

4.4.3  在 ALTER TABLE 时添加(复合)主键约束

        字段列表可以是一个字段,也可以是多个字段,如果是多个字段的话,是复合主键     

语法格式:

        1. ALTER TABLE 表名称 MODIFY 字段名 数据类型 PRIMARY KEY;
        2. ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表);

举例:  

4.5 删除主键约束 

        删除主键约束,不需要指定主键名,因为一个表只有一个主键,     删除主键约束后,非空还存在。     (但在实际开发中,不会去删除表中的主键约束)     

语法格式:  

        
    alter table 表名称 
  
        drop primary key;

举例:  

5. 自增列:AUTO_INCREMENT

5.1 作用

        某个字段的值自增      

5.2 关键字

        auto_increment      

5.3 特点和要求

            1. 一个表最多只能有一个自增长列    

        2. 当需要产生唯一标识符或顺序值时,可设置自增长    

        3. 自增长列约束的列必须是键列(主键列,唯一键列)    

        4. 自增约束的列的数据类型必须是整数类型    

        5. 如果自增列指定了 0 和 null,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接 赋值为具体值     

5.4 添加自增约束

5.4.1 在CREATE TABLE 时添加自增约束

语法格式:

                create table 
    表名称( 
  
                字段名 数据类型 primary key auto_increment,
  
                字段名 数据类型 ,
  
                字段名 数据类型 ,
  
                字段名 数据类型 
  
                );
  
                create table 表名称( 
  
                字段名 数据类型 ,
  
                字段名 数据类型 unique key auto_increment, 
  
                字段名 数据类型 
  
                );

举例:  

非法创建:

 正确创建方式:

插入数据: 

 特殊情况(不推荐此写法):

5.4.2 在 ALTER TABLE 时添加自增约束

语法格式:   

        alter table 
    表名称 
  
        modify 字段名 数据类型 auto_increment;

举例:  

5.5 删除自增约束

语法格式:   

        alter table 表名称 modify 字段名 数据类型;

举例:  

5.6 MySQL 8.0新特性—自增变量的持久化

        在MySQL 8.0    之前,自增主键    AUTO_INCREMENT    的值如果大于    max(primary key)+1    ,在    MySQL    重启后,会重 置AUTO_INCREMENT=max(primary key)+1    ,这种现象在某些情况下会导致业务主键冲突或者其他难以发 现的问题。 下面通过案例来对比不同的版本中自增变量是否持久化。   

案例:  

        对于MySQL5.7版本: 

 然后重启MySQL57服务器:(以管理员的身份运行)

 

結果から、新しく挿入された 0 が 割り当てられる値は、 4 、再起動前の動作ロジックに従って、ここに割り当てられる必要があります 6 。上記の結果の主な理由は、自動インクリメントする主キーが永続化されていないことです。

MySQL 5.7 システムでは、自動インクリメント主キーの割り当てルールは次のように決定されます。 InnoDB データ ディクショナリ内に 1 つ カウンター 決めてカウンターはインのみ インメモリメンテナンス 、ディスクには保存されません。このカウンタは、データベースが再起動されると初期化されます。

MySQL8.0 バージョンの場合:

次に、MySQL80 サーバーを再起動します: (管理者として実行)

結果から、自動インクリメント変数が永続化されていることがわかります。

MySQL 8.0 は、自動インクリメントされる主キーのカウンターを永続化します。 やり直しログ 真ん中。カウンタが変更されるたびに、REDO ログに書き込まれます。データベースが再起動されると、InnoDB カウンタのメモリ値は、REDO ログの情報に基づいて初期化されます。

6. FOREIGN KEY 制約

6.1 機能

テーブル内のフィールドの参照整合性を制限します。

たとえば、従業員の従業員を選択するには、部門テーブルで対応する部分を見つける必要があります。

##6.2 キーワード

FOREIGN KEY

6.3 マスターテーブルとスレーブテーブル/親テーブルと子テーブル

マスターテーブル(親テーブル): 被参照テーブル、被参照テーブル

テーブル (サブテーブル) から: 他のテーブルから引用し、他のテーブルを参照します。

例: 従業員テーブルの従業員の値は、部門テーブル: 部門テーブルがメインテーブルとしてメインテーブルとなり、従業員テーブルがスレーブテーブルとなります。

例: 学生スケジュール、コース スケジュール、コース選択スケジュール: コース選択スケジュールの学生とコースは、それぞれ学生スケジュールとコース スケジュールを参照してください。学生スケジュールとコース スケジュールはマスター スケジュールです。 、コース選択スケジュールはスレーブスケジュールです。

6.4 機能

1. テーブルの外部キー列から、 メインテーブルの主キーまたは一意制約列を参照/参照する必要があります

依存/参照されるため、値は唯一である必要があります

2. 创建外键约束時、如果不给外键约束命名、軘认名は列名ではなく、自動です外部キー名 (たとえば、student_ibfk_1;) を生成し、外部キー制約名を指定することもできます。

3. テーブル作成(CREATE)時に外部キー制約を指定する場合は、マスターテーブルを作成してからスレーブテーブルを作成してください。

4. テーブルを削除する場合は、スレーブテーブルを削除します。テーブルを最初に削除(または外部キー制約を使用して削除)してから、メインテーブルを削除します

5. メインテーブルのレコードがスレーブテーブルによって参照される場合、マスターテーブルのレコードは削除されませんデータを削除したい場合は、まずスレーブ テーブルから依存レコードを削除する必要があります。その後、メイン テーブルのデータを削除できます。

6. で外部キー制約を指定します。 「スレーブ テーブル」、テーブルは複数の外部キー制約を確立できます

        7. 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。如果类型不一样,创建子表时,就会出现错误。     

        8.      当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是外键的约束名。(根据外键查询效率很高)      

        9. 删除外键约束后,必须 手动 删除对应的索引     

6.5 添加外键约束

6.5.1 在 create table 时添加外键约束

语法格式:

     
         create table 
     主表名称( 
    
        字段1 数据类型 primary key, 
    
        字段2 数据类型 
    
        );
    
        create table 从表名称( 
    
        字段1 数据类型 primary key, 
    
        字段2 数据类型, 
    
        [CONSTRAINT <外键约束名称>] FOREIGN KEY(从表的某个字段) references 主表名(被参考字段) [on update xx][on delete xx];
    
        );

-- FOREIGN KEY: 在表级指定子表中的列      

-- REFERENCES: 标示在父表中的列       

(从表的某个字段)的数据类型必须与主表名(被参考字段)的数据类型一致,逻辑意义也一样    

(从表的某个字段)的字段名可以与主表名(被参考字段)的字段名一样,也可以不一样       

举例:  

正确的创建方式:

 错误的创建方式:

 添加数据:

 修改数据:

 删除数据:

 6.5.2 在ALTER TABLE 时添加外键约束

        一般情况下,表与表的关联都是提前设计好了的,因此,会在创建表的时候就把外键约束定义好。不过,如果需要修改表的设计(比如添加新的字段,增加新的关联关系),但没有预先定义外键约束,那么,就要用修改表的方式来补充定义。    

语法格式:   

        ALTER TABLE 从表名 
    
        ADD [CONSTRAINT 约束名] FOREIGN KEY (从表的字段) REFERENCES 主表名(被引用 字段) [on update xx][on delete xx];

6.7 约束等级(级联)

       1.  Cascade    方式    :在父表上    update/delete    记录时,同步    update/delete    掉子表的匹配记录  

        2. Set null方式    :在父表上    update/delete    记录时,将子表上匹配记录的列设为    null    ,但是要注意子 表的外键列不能为not null  

        3. No action方式    :如果子表中有匹配的记录,则不允许对父表对应候选键进行    update/delete    操作  

        4 .Restrict方式 (默认)    :同no action    , 都是立即检查外键约束  

        5. Set default方式    (在可视化工具    SQLyog    中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb    不能识别    

        如果没有指定等级,就相当于Restrict方式。  

        对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式。   

举例:(以 on update cascade on delete set null          为例)  

1.创建表

2.添加数据

3.修改数据 

4.删除数据 

6.8 删除外键约束

流程如下:

(1)第一步先查看约束名和删除外键约束    

        #查看某个表的约束名
    
        SELECT * FROM information_schema.table_constraints 
    
        WHERE table_name = &#39;表名称&#39;;
    
        ALTER TABLE 从表名 
    
        DROP FOREIGN KEY 外键约束名;

(     2)第二步查看索引名和删除索引。(注意,只能手动删除)    

        #查看某个表的索引名    

        SHOW INDEX FROM 表名称;      
        ALTER TABLE 从表名 DROP INDEX 索引名;

注意: 删除外键约束后,必须 手动 删除对应的索引     

举例:  

6.9 开发场景

问题     1     :如果两个表之间有关系(一对一、一对多),比如:员工表和部门表(一对多),它们之间是否     一定要建外键约束?    

        答:不是的      

问题     2     :建和不建外键约束有什么区别?    

        答:建外键约束,你的操作(创建表、删除表、添加、修改、删除)会受到限制,从语法层面受到限制。    

        例如:在员工表中不可能添加一个员工信息,它的部门的值在部门表中找不到。      

        不建外键约束,你的操作(创建表、删除表、添加、修改、删除)不受限制,要保证数据的     引用完整 性     ,只能依     靠程序员的自觉     ,或者是     在     Java     程序中进行限定     。例如:在员工表中,可以添加一个员工的信息,它的部门指定为一个完全不存在的部门。      

问题     3     :那么建和不建外键约束和查询有没有关系?    

        答:没有     

拓展:   

        在 MySQL     里,外键约束是有成本的,需要消耗系统资源。对于大并发的     SQL     操作,有可能会不适 合。比如大型网站的中央数据库,可能会     因为外键约束的系统开销而变得非常慢     。所以,     MySQL     允 许你不使用系统自带的外键约束,在     应用层面     完成检查数据一致性的逻辑。也就是说,即使你不 用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。     

6.10 阿里开发规范

【 强制 】不得使用外键与级联,一切外键概念必须在应用层解决。      

        说明:(概念解释)学生表中的 student_id 是主键,那么成绩表中的      student_id      则为外键。如果更新学 生表中的 student_id      ,同时触发成绩表中的      student_id      更新,即为级联更新。外键与级联更新适用于      单机低并发      ,不适合      分布式      、      高并发集群      ;级联更新是强阻塞,存在数据库      更新风暴      的风险;外键影响 数据库的      插入速度      。

7. CHECK 约束

7.1 作用

        检查某个字段的值是否符号xx     要求,一般指的是值的范围      

7.2 关键字

        CHECK      

7.3 说明:MySQL 5.7 不支持

        MySQL5.7 可以使用     check约束,但check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告。    

        MySQL 8.0中可以使用check约束了     。     

7.4 添加CHECK 约束

8. DEFAULT约束

8.1 作用

        给某个字段/    某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。    

8.2 关键字

        DEFAULT    

8.3 添加默认值约束

8.3.1 在 CREATE TABLE时添加默认值约束

语法格式:

        方式1:

                create table 
    表名称( 
  
                字段名 数据类型 primary key, 
  
                字段名 数据类型 unique key not null, 
  
                字段名 数据类型 unique key, 
  
                字段名 数据类型 not null default 默认值, 
  
                );

           方式2:  

                create table 
    表名称(
  
                字段名 数据类型 default 默认值 , 
    
                字段名 数据类型 not null default 默认值, 
    
                字段名 数据类型 not null default 默认值, 
    
                primary key(字段名), 
    
                unique key(字段名) 
    
                );

        说明:默认值约束一般不在唯一键和主键列上加      

举例:  

8.3.2 在 ALTER TABLE时添加默认值约束

语法格式:

        alter table 
    表名称 modify 字段名 数据类型 default 默认值; 
  
        alter table 表名称 modify 字段名 数据类型 default 默认值 not null
    ;

注:

        1.如果这个字段原来有非空约束,你还保留非空约束,那么在加默认值约束时,还得保留非空约束,否则非空约束就被删除了。

        2.同理,在给某个字段加非空约束也一样,如果这个字段原来有默认值约束,你想保留,也要在modify语句中保留默认值约束,否则就删除了。   

举例:  

8.4 删除默认值约束

语法格式:

        1.删除默认值约束,也不保留非空约束

                alter table 
    表名称 modify 字段名 数据类型 ;

        2.删除默认值约束,保留非空约束  

                alter table 
    表名称 modify 字段名 数据类型 not null
    ;

举例:  

9. 面试

面试   1   、为什么建表时,加   not null default ''   或   default 0  

        答:不想让表中出现null   值。    

面试   2   、为什么不想要   null   的值  

        答:   (1)不好比较。   null   是一种特殊值,比较时只能用专门的   is null   和   is not null   来比较。碰到运算符,通常返回null   。  

            (2)效率不高。影响提高索引效果。因此,我们往往在建表时 not null default ''   或   default 0    

面试   3   、带   AUTO_INCREMENT   约束的字段值是从   1   开始的吗?  

        在MySQL   中,默认AUTO_INCREMENT的初始 值是1,每新增一条记录,字段值自动加1   。设置自增属性(AUTO_INCREMENT)的时候,还可以指定第 一条插入记录的自增字段的值,这样新插入的记录的自增字段值从初始值开始递增,如在表中插入第一 条记录,同时指定id   值为   5   ,则以后插入的记录的   id   值就会从   6   开始往上增加。添加主键约束时,往往需要 设置字段自动增加属性。    

面试   4   、并不是每个表都可以任意选择存储引擎?   外键约束(  

FOREIGN KEY) はエンジン間で使用できません。 (マスターテーブルとスレーブテーブルで使用するエンジンは同じである必要があります)

MySQL は複数のストレージ エンジンをサポートしています。各テーブルは異なるストレージ エンジンを指定できます。データの参照整合性を確保するために外部キー制約が使用されることに注意してください。テーブルを関連付ける必要がある場合外部キーの場合異なるストレージ エンジンを指定すると、これらのテーブル間に外部キー制約を作成できなくなります。したがって、ストレージ エンジンの選択は完全に任意というわけではありません。

推奨学習: mysql ビデオ チュートリアル


##位置

サポートされる制約タイプ

制約に名前を付けることはできますか

##列レベルの制約:

#テーブル レベルの制約:

すべての列の下

デフォルトと空以外はサポートされませんが、その他はサポートされます

はい (主キーは効果がありません)

以上が分析例 MySQL 制約の知識ポイントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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