ホームページ >データベース >mysql チュートリアル >mysql 整合性制約の詳細な紹介
1. はじめに
制約条件はデータ型の幅と同じであり、オプションのパラメータです
関数: に使用されます。データの整合性と一貫性を確保します。
は主に次のとおりです。
PRIMARY KEY
(PK) #このフィールドをテーブルの主キーとして識別します。 Record
FOREIGN KEY
(FK) #このフィールドをテーブルの外部キーとして識別します
NOT NULL
#それを識別しますこのフィールドを空にすることはできません
UNIQUE KEY
(UK) #このフィールドを識別する値は一意です
AUTO_INCREMENT
#これを識別する値フィールドは自動的に増加します (整数型、主キーです)
DEFAULT
#このフィールドのデフォルト値を設定します
UD
# #NSIGNED #Unsigned
ZEROFILL #Fill with 0
2. NOT NULL および DEFAULT
NULL 可能かどうか、null は空、非文字列を意味しますnot null - not nullable
null - nullable
create table tb1( nid int not null defalut 2, num int not null);
注:
1. デフォルト値は空にすることができます2. null 以外の値を設定します。また、値を挿入するときは空にすることはできません3。ID フィールドにデフォルト値を設定すると、ID フィールドが null か null でないかに関係なく機能します。空白を挿入すると、デフォルト値が空白を挿入するとデフォルトで指定された値が埋められます3. UNIQUE
中国語翻訳: 異なります。 mysql では、これは単一列の unique と呼ばれます例: 会社の部門テーブルを作成します (各会社には一意の部門があります)mysql> create table department( -> id int, -> name char(10) -> ); Query OK, 0 rows affected (0.01 sec) mysql> insert into department values(1,'IT'),(2,'IT'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0mysql> select * from department; +------+------+| id | name | +------+------+| 1 | IT | | 2 | IT | +------+------+2 rows in set (0.00 sec) # 发现: 同时插入两个IT部门也是可以的,但这是不合理的,所以我们要设置name字段为unique 解决这种不合理的现象。次に、一意の制約を使用して、会社の部門フィールドを定義します。セット。
#第一种创建unique的方式#例子1:create table department( id int, name char(10) unique ); mysql> insert into department values(1,'it'),(2,'it'); ERROR 1062 (23000): Duplicate entry 'it' for key 'name' #例子2:create table department( id int unique, name char(10) unique ); insert into department values(1,'it'),(2,'sale'); #第二种创建unique的方式create table department( id int, name char(10) , unique(id), unique(name) ); insert into department values(1,'it'),(2,'sale');United unique:
# 创建services表mysql> create table services( id int, ip char(15), port int, unique(id), unique(ip,port) ); Query OK, 0 rows affected (0.05 sec) mysql> desc services; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | id | int(11) | YES | UNI | NULL | | ip | char(15) | YES | MUL | NULL | | port | int(11) | YES | | NULL | |+-------+----------+------+-----+---------+-------+| 3 rows in set (0.01 sec) #联合唯一,只要两列记录,有一列不同,既符合联合唯一的约束mysql> insert into services values (1,'192,168,11,23',80), (2,'192,168,11,23',81), (3,'192,168,11,25',80); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from services; +------+---------------+------+ | id | ip | port | +------+---------------+------+ | 1 | 192,168,11,23 | 80 | | 2 | 192,168,11,23 | 81 | | 3 | 192,168,11,25 | 80 | +------+---------------+------+ 3 rows in set (0.00 sec) mysql> insert into services values (4,'192,168,11,23',80); ERROR 1062 (23000): Duplicate entry '192,168,11,23-80' for key 'ip'
4. PRIMARY KEY
主キーとして複数のカラム(複合主キー)
#ストレージ エンジンのデフォルトは (innodb): innodb ストレージ エンジンの場合、テーブルには主キーが必要です。
単一列主キー:
# 创建t14表,为id字段设置主键,唯一的不同的记录create table t14( id int primary key, name char(16) ); insert into t14 values(1,'xiaoma'),(2,'xiaohong'); mysql> insert into t14 values(2,'wxxx'); ERROR 1062 (23000): Duplicate entry '6' for key 'PRIMARY' # not null + unique的化学反应,相当于给id设置primary key create table t15( id int not null unique, name char(16) ); mysql> create table t15( -> id int not null unique, -> name char(16) -> ); Query OK, 0 rows affected (0.01 sec) mysql> desc t15; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | char(16) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.02 sec)
複合主キー:
create table t16( ip char(15), port int, primary key(ip,port) ); insert into t16 values('1.1.1.2',80),('1.1.1.2',81);
5. AUTO_INCREMENT
制約: 制約されたフィールドは自動的に拡張され、制約されたフィールドは同時にキーによって制約される必要があります
create table student( id int primary key auto_increment, name varchar(20), sex enum('male','female') default 'male' );
1。ID が指定されていない場合は、自動的に拡張されます
2. id
## を指定することもできます #3. 自己増加フィールドの場合、delete で削除してから値を挿入すると、フィールドは削除前の位置に応じて増加し続けます##auto_increment_increment
と
auto_increment_offset の違い <pre class="brush:sql;toolbar:false">查看可用的 开头auto_inc的词
mysql> show variables like &#39;auto_inc%&#39;;
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
rows in set (0.02 sec)
# 步长auto_increment_increment,默认为1
# 起始的偏移量auto_increment_offset, 默认是1
# 设置步长 为会话设置,只在本次连接中有效
set session auto_increment_increment=5;
#全局设置步长 都有效。
set global auto_increment_increment=5;
# 设置起始偏移量
set global auto_increment_offset=3;
#强调: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的值会被忽略
# 设置完起始偏移量和步长之后,再次执行show variables like&#39;auto_inc%&#39;;
发现跟之前一样,必须先exit,再登录才有效。
mysql> show variables like&#39;auto_inc%&#39;;
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 5 |
| auto_increment_offset | 3 |
+--------------------------+-------+
rows in set (0.00 sec)
#因为之前有一条记录id=1
mysql> select * from student;
+----+---------+------+
| id | name | sex |
+----+---------+------+
| 1 | xiaobai | male |
+----+---------+------+
row in set (0.00 sec)
# 下次插入的时候,从起始位置3开始,每次插入记录id+5
mysql> insert into student(name) values(&#39;ma1&#39;),(&#39;ma2&#39;),(&#39;ma3&#39;);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
+----+---------+------+
| id | name | sex |
+----+---------+------+
| 1 | xiaobai | male |
| 3 | ma1 | male |
| 8 | ma2 | male |
| 13 | ma3 | male |
+----+---------+------+
auto_increment_increment和 auto_increment_offset</pre>
delete
と
のテーブルの明確な区別:
delete from t1; #自動インクリメント ID がある場合は、新しい ID データは削除前の最後の ID から開始されます。 truncate table t1;データ量が多く、削除速度が以前のものより速く、ゼロから直接開始されます。
6. FOREIGN KEY
この会社には 3 つの部門がありますが、従業員は 1 億人であるため、部門フィールドを繰り返し保存する必要があります。部門名が長いほど無駄が多くなります。それはそうです。
現時点では、
解決策:
部門テーブルを完全に定義できます
次に、従業員情報テーブルをそのテーブルに関連付けます。関連付けるための、つまり外部キーです。
2 つのテーブルの作成操作:
#1.创建表时先创建被关联表,再创建关联表 # 先创建被关联表(dep表) create table dep( id int primary key, name varchar(20) not null, descripe varchar(20) not null ); #再创建关联表(emp表) create table emp( id int primary key, name varchar(20) not null, age int not null, dep_id int, constraint fk_dep foreign key(dep_id) references dep(id) ); #2.插入记录时,先往被关联表中插入记录,再往关联表中插入记录 insert into dep values (1,'IT','IT技术有限部门'), (2,'销售部','销售部门'), (3,'财务部','花钱太多部门'); insert into emp values (1,'zhangsan',18,1), (2,'lisi',19,1), (3,'djb',20,2), (4,'dogfa',40,3), (5,'oldniu',18,2); 3.删除表 #按道理来说,删除了部门表中的某个部门,员工表的有关联的记录相继删除。 mysql> delete from dep where id=3; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`db5`.`emp`, CONSTRAINT `fk_name` FOREIGN KEY (`dep_id`) REFERENCES `dep` (`id`)) #但是先删除员工表的记录之后,再删除当前部门就没有任何问题 mysql> delete from emp where dep =3; Query OK, 1 row affected (0.00 sec) mysql> select * from emp; +----+----------+-----+--------+ | id | name | age | dep_id | +----+----------+-----+--------+ | 1 | zhangsan | 18 | 1 | | 2 | lisi | 18 | 1 | | 3 | djb | 20 | 2 | | 5 | oldniu | 18 | 2 | +----+----------+-----+--------+ rows in set (0.00 sec) mysql> delete from dep where id=3; Query OK, 1 row affected (0.00 sec) mysql> select * from dep; +----+-----------+----------------------+ | id | name | descripe | +----+-----------+----------------------+ | 1 | IT | IT技术有限部门 | | 2 | 销售部 | 销售部门 | +----+-----------+----------------------+ rows in set (0.00 sec)
テーブル レコードを削除する上記の操作は比較的面倒です。論理的に言えば、ある部門が解雇されると、その部門の従業員は部門も解雇されるだろう。実はテーブル作成時にはもう一つ重要な内容がありまして、それが同期削除と同期更新というものです
次に新しく作成した2つのテーブルを全て削除しますまず関連するテーブル(emp)を削除してから削除します関連テーブル (dep)
Next:
上記の操作を繰り返してテーブルを作成しますNote: 関連テーブルへの削除カスケードを追加します。
#同期削除
更新カスケードで #同期更新emp テーブルを変更:
<pre class="brush:sql;toolbar:false">create table emp(
id int primary key,
name varchar(20) not null,
age int not null,
dep_id int,
constraint fk_dep foreign key(dep_id) references dep(id)
on delete cascade #同步删除
on update cascade #同步更新
);</pre><p>接下来的操作,就符合我们正常的生活中的情况了。<span style='color: rgb(102, 102, 102); font-family: "Courier New", sans-serif; font-size: 12px; text-align: justify; white-space: pre-wrap; background-color: rgb(245, 245, 245);'></span><br></p><pre class="brush:sql;toolbar:false">#再去删被关联表(dep)的记录,关联表(emp)中的记录也跟着删除
mysql> delete from dep where id=3;
Query OK, 1 row affected (0.00 sec)
mysql> select * from dep;
+----+-----------+----------------------+
| id | name | descripe |
+----+-----------+----------------------+
| 1 | IT | IT技术有限部门 |
| 2 | 销售部 | 销售部门 |
+----+-----------+----------------------+
rows in set (0.00 sec)
mysql> select * from emp;
+----+----------+-----+--------+
| id | name | age | dep_id |
+----+----------+-----+--------+
| 1 | zhangsan | 18 | 1 |
| 2 | lisi | 19 | 1 |
| 3 | djb | 20 | 2 |
| 5 | oldniu | 18 | 2 |
+----+----------+-----+--------+
rows in set (0.00 sec)</pre><p>#再去更改被关联表(dep)的记录,关联表(emp)中的记录也跟着更改</p><pre class="brush:sql;toolbar:false"> mysql> update dep set id=222 where id=2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0</pre><pre class="brush:sql;toolbar:false"># 赶紧去查看一下两张表是否都被删除了,是否都被更改了
mysql> select * from dep;
+-----+-----------+----------------------+
| id | name | descripe |
+-----+-----------+----------------------+
| 1 | IT | IT技术有限部门 |
| 222 | 销售部 | 销售部门 |
+-----+-----------+----------------------+
rows in set (0.00 sec)
mysql> select * from emp;
+----+----------+-----+--------+
| id | name | age | dep_id |
+----+----------+-----+--------+
| 1 | zhangsan | 18 | 1 |
| 2 | lisi | 19 | 1 |
| 3 | djb | 20 | 222 |
| 5 | oldniu | 18 | 222 |
+----+----------+-----+--------+
rows in set (0.00 sec)</pre><p>以上便是常用约束的详细实例介绍,想了解更多相关问题请访问PHP中文网:<a href="https://www.php.cn/course/list/51/type/2.html" target="_blank">mysql视频教程</a><br></p>
以上がmysql 整合性制約の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。