Mysql整合性制約

34853 ワード

一、制約条件
制約条件は、データ型の幅と同様にオプションです.
役割:データの整合性と一貫性を保証するために、主に次のように分けられます.
PRIMARY KEY (PK)               ,         
FOREIGN KEY (FK)               
NOT NULL             
UNIQUE KEY (UK)               
AUTO_INCREMENT               (    ,     )
DEFAULT             

UNSIGNED    
ZEROFILL   0  

説明:
1.       ,  NULL,   NOT NULL,       ,    
2.         ,       NULL,             ,        
sex enum('male','female') not null default 'male'
age int unsigned NOT NULL default 20      (   )          20
3.    key
   primary key
   foreign key
   (index,unique...)


二、not nullとdefault
空にできるかどうか、nullは空を表し、文字列not null-空にできないnull-空にできる
「≪デフォルト|Defaults|Essbase_Studio≫」列の作成時にデフォルト値を指定できます.データの挿入時にプロアクティブに設定しない場合、デフォルト値が自動的に追加されます.
 
 
create table t1 (
id int not null  default 2  ,
num int not null
);


MariaDB [task]> desc t4
    -> ;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   |     | 2       |       |
| num   | int(11) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
==================default====================
#  id       ,   id   null  not null,      ,       default      



三、unique(一意)
============       UNIQUE===============
   

create table t5 (
id int ,
name varchar(50) unique #      
);

   
MariaDB [task]> create table t6 (
    -> id int,
    -> name  varchar(50),
    -> constraint test_name  unique(name)  ,  ,  ,   (  )
    -> );


MariaDB [task]> insert into t5 values  (1,'  ');
Query OK, 1 row affected (0.00 sec)

MariaDB [task]> insert into t5 values  (1,'  ');
ERROR 1062 (23000): Duplicate entry '  ' for key 'name'
MariaDB [task]> 

 
 
連合は唯一で、単一の記録は繰り返すことができて、複数の記録は繰り返すことができなくて、例えばIPは繰り返すことができて、ポートも繰り返すことができて、しかしいっしょに繰り返すことができなくて、
create table service(
id int primary key auto_increment,
name varchar(20),
host varchar(15) not null,
port int not null,
unique(host,port) #    
);


MariaDB [task]> desc service ;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| host  | varchar(15) | NO   | MUL | NULL    |                |
| port  | int(11)     | NO   |     | NULL    |                |

 
四、primary key
primary keyフィールドの値は空ではなく一意です
1つのテーブルで次のことができます.
単一列をプライマリ・キーとし、複数列をプライマリ・キーとする(複合プライマリ・キー)
ただし、1つのテーブルにプライマリ・キーprimary keyは1つしかありません.
ここはすべての空白だけではなくて、みんなはきっとnot null+uniqueを考えて、実はprimary keyはこの2つの方法の結合です
 、    

MariaDB [task]> create table t7 (
 id int primary key, #    primary key       not null unique 
 name varchar(50) not null 
);
Query OK, 0 rows affected (0.00 sec)

MariaDB [task]> desc t7;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(50) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
create table t8(
id int,
name varchar(20),
comment varchar(100),
constraint pk_name primary key(id); #         pk_name

 
複数列のプライマリ・キー
MariaDB [task]> create table t8 (
    -> ip varchar(15),
    -> port char(5),
    -> service_name varchar(10) not null ,
    -> primary key(ip,port) # IP     ,      ,   IP+      。
    -> );
Query OK, 0 rows affected (0.01 sec)

MariaDB [task]> 
MariaDB [task]> desc t8 ;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ip           | varchar(15) | NO   | PRI |         |       |
| port         | char(5)     | NO   | PRI |         |       |
| service_name | varchar(10) | NO   |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

MariaDB [task]> insert into t8 values
    -> ('127.0.0.1','80','httpd'),
    -> ('127.0.0.2','80','apache')
    -> ;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [task]> insert into t8 values
    -> ('127.0.0.1','80','httpd');
ERROR 1062 (23000): Duplicate entry '127.0.0.1-80' for key 'PRIMARY'
MariaDB [task]> 

 
五、auto_increment
コンストレイントフィールドは自動的に増加します.コンストレイントされたフィールドはkeyコンストレイントされる必要があります.
MariaDB [task]> insert into t8 values
    -> ('127.0.0.1','80','httpd');
ERROR 1062 (23000): Duplicate entry '127.0.0.1-80' for key 'PRIMARY'
MariaDB [task]> create  table t9 (
    -> id int primary key   auto_increment,
    -> name  varchar(10)
    -> );


MariaDB [task]> insert into t9(name)  values 
    -> ('xiaojiu') ;

MariaDB [task]> insert into t9(name)  values 
    -> ('xiao') ;

MariaDB [task]> select *from t9 ;
+----+---------+
| id | name    |
+----+---------+
|  1 | xiaojiu |
|  2 | xiao    |
+----+---------+

ステップの表示
 
MariaDB [(none)]> show variables like 'auto_incre%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |
| auto_increment_offset    | 1     |
+--------------------------+-------+


    
#    
sqlserver:    
         
    create table t1(
        id int。。。
    )engine=innodb,auto_increment=2   =2 default charset=utf8

mysql     :
    show session variables like 'auto_inc%';

    #      
    set session auth_increment_increment=2 #         

    #       
    set global auth_increment_increment=2 #         (       )


#!!!         !!!
If the value of auto_increment_offset is greater than that of auto_increment_increment, the value of auto_increment_offset is ignored. 
  :  auto_increment_offset    auto_increment_increment  , auto_increment_offset       
  :  auto_increment_offset=3,auto_increment_increment=2

 
六、foreign key外部キー
foreign keyの迅速な理解
従業員情報テーブルには、工番氏名部門の3つのフィールドがあります.
会社には3つの部門がありますが、1億人の従業員がいます.それは、部門というフィールドを繰り返し保存する必要があることを意味します.部門の名前が長ければ長いほど、浪費されます.
解決方法:
部門表を完全に定義できます
次に、従業員情報テーブルにテーブルを関連付ける方法、すなわちforeign key
#      innodb    ,       , references           ,      
 
create table t11 (  #    
id int primary key ,
name varchar(50) not null
);

create table t12(
id int primary key,
name varchar(10),
t10_id int,
constraint  t11_name  foreign key(t10_id) #    
references  t12(id)  #         
on delete cascade  #    ,              
on update cascade #     ,          
)engine=innodb; #       innodb

insert into  t11 values
(1,'           '),
(2,'         '),
(3,'   ');

insert into t12 values
(1,'hha',1),
(2,'hehe',2),
(3,'gaga',2)
;

2どのように2枚の表の間の関係を探し出します
    :
#1、          
                    ,   ,          foreign key       (   id)

#2、          
                    ,   ,          foreign key       (   id)

#3、  :
#   :
      1  ,         
      2  ,         

#   
    1 2    ,                ,    ,                        

#   :
  1 2    ,                    ,    。       ,     foreign key      ,           unique  




 

転載先:https://www.cnblogs.com/mjiu/p/9132350.html