Die wörtliche Bedeutung von Einschränkungen besteht darin, festzulegen oder einzuschränken, wie etwas getan werden soll. In MySQL dienen Einschränkungen dazu, Regeln für die Daten in der Datentabelle anzugeben, dh die Daten einzuschränken, um die Zuverlässigkeit sicherzustellen, z. B. nicht In einer bestimmten Spalte dürfen Nullwerte angezeigt werden. In der Praxis werden wir auf die folgenden Arten von Einschränkungen stoßen.
-
NOT NULL
: Stellen Sie sicher, dass die Spalte keinen NULL-Wert haben darf -
CHECK
: 确保列中的值满足特定条件 -
UNIQUE
: 确保一列中的所有值都不同 -
PRIMARY KEY
:NOT NULL
和UNIQUE
组合,唯一标识表中的每一行 -
FOREIGN KEY
: 外键约束 -
DEFAULT
: 如果未指定值,则为列设置默认值
NOT NULL
: 确保列不能有NULL值【相关推荐:mysql视频教程】
约束
1.NULL
MySQL中通过使用NOT NULL
确保列中不会出现Null值,创建表时候格式如下:
mysql> create table user(name varchar(255)not null); Query OK, 0 rows affected (0.06 sec)
如果试图插入一个null值,则会抛出异常。
mysql> insert user values(null); ERROR 1048 (23000): Column 'name' cannot be null
或者在现有表上新增NOT NULL
约束。
mysql> alter table user modify name varchar(255) not null; Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0
删除NOT NULL
约束。
mysql> alter table user modify name varchar(255) null; Query OK, 0 rows affected (0.09 sec) Records: 0 Duplicates: 0 Warnings: 0
2.CHECK
如果想在列上定义条件约束,可以使用CHECK,比如下面,强制让年龄字段大于18,小于80,否则将会报错。
mysql> create table user(age int(11) check(age>18 and age <80)); Query OK, 0 rows affected, 1 warning (0.06 sec)
插入测试,可以发现9、81在插入的时候抛出异常。
mysql> insert user values(9); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(19); Query OK, 1 row affected (0.01 sec) mysql> insert user values(81); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql>
也可以进行多列约束,如年龄必须大于18,城市必须为中国。
mysql> create table user(age int(11),city varchar(255) ,check(age>18 and city='中国')); Query OK, 0 rows affected, 1 warning (0.05 sec)
插入测试。
mysql> insert user values(81,'2'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(8,'2'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(20,'2'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(20,'中国'); Query OK, 1 row affected (0.01 sec) mysql> insert user values(20,'中国1'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(85,'中国'); Query OK, 1 row affected (0.01 sec) mysql> insert user values(9,'中国'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
还可以让列值必须在指定集合中,如性别必须在男、女、未知、人妖集合中。
mysql> create table user(sex varchar(255) check (sex in ('男','女','未知','人妖'))); Query OK, 0 rows affected (0.05 sec)
插入测试。
mysql> insert user values("男"); Query OK, 1 row affected (0.02 sec) mysql> insert user values("男男"); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values("女"); Query OK, 1 row affected (0.01 sec) mysql> insert user values("人妖"); Query OK, 1 row affected (0.00 sec)
为约束命名并删除约束。
mysql> create table user (age int(11) ,constraint CHK_AGE check(age>18)); Query OK, 0 rows affected, 1 warning (0.05 sec) mysql> insert user values(5); ERROR 3819 (HY000): Check constraint 'CHK_AGE' is violated. mysql> alter table user drop check CHK_AGE; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> insert user values(5); Query OK, 1 row affected (0.01 sec)
但是,这样的写法你见过吗?
猜猜下面的作用是什么。
这其实是一个case when条件判断,让其仅仅可以插入>=18,或者是在0-10之间的数。
CREATE TABLE `user` (`age` int(11) CHECK (((case when (`age` >=18) then 1 else (case when age<10 and age >0 then 1 else 2 end) end) =1)));
3.UNIQUE
UNIQUE
约束确保列中的没有重复的值,UNIQUE
和 PRIMARY KEY
约束都为一列值的唯一性提供保障,但是UNIQUE
每个表可以出现多次,而PRIMARY KEY
只能出现一个。
如下面name字段不能重复。
mysql> create table user (name varchar(255),unique(name)); Query OK, 0 rows affected (0.07 sec)
插入测试。
mysql> insert user values("张三"); Query OK, 1 row affected (0.02 sec) mysql> insert user values("张三"); ERROR 1062 (23000): Duplicate entry '张三' for key 'user.name'mysql>
对此约束进行起名,并删除。
mysql> create table user (name varchar(255),constraint name_un unique(name)); Query OK, 0 rows affected (0.07 sec) mysql> insert user values("张三"); Query OK, 1 row affected (0.02 sec) mysql> insert user values("张三"); ERROR 1062 (23000): Duplicate entry '张三' for key 'user.name_un' mysql> alter table user drop index name_un; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> insert user values("张三"); Query OK, 1 row affected (0.02 sec)
插入后可以用以下语句查看创建语句。
mysql> show create table user; +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ | user | CREATE TABLE `user` ( `name` varchar(255) DEFAULT NULL, UNIQUE KEY `name_un` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
要删除UNIQUE
约束,可以使用DROP INDEX
或ALTER TABLE
语句:
mysql> DROP INDEX name_un ON user; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table user; +-------+-----------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------+ | user | CREATE TABLE `user` ( `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+-----------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
在现有表上添加。
mysql> alter table user add constraint name_un unique(name); Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0
4.PRIMARY KEY
通常每个表中包含一个用于唯一标识每一行的值,这个列就被称为PRIMARY KEY。
mysql> create table user (id int(11) ,age int(11),primary key (id)); Query OK, 0 rows affected, 2 warnings (0.06 sec) mysql> insert user values(1,2); Query OK, 1 row affected (0.02 sec) mysql> insert user values(1,2); ERROR 1062 (23000): Duplicate entry '1' for key 'user.PRIMARY'mysql>
5.FOREIGN KEY
FOREIGN KEY
用于约束表中的一个字段必须是另一个表中某个字段所存在的值,但是在另一个表中,这个列不一定是主键,但必须是唯一性索引,否则会创建失败。
比如orders表中的userId必须参考user表中的id,如果插入的userId在user表中不存在,则无法插入。
mysql> create table orders (id int(11) primary key ,userId int(11) , FOREIGN KEY (userId) REFERENCES user(id) ); Query OK, 0 rows affected, 2 warnings (0.06 sec) mysql> insert orders values(1,3); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`t`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `user` (`id`)) mysql> insert orders values(1,1); Query OK, 1 row affected (0.01 sec)
但是存在一个问题,如果主表(user)中记录被删除或者更新,那orders中的记录该怎么办?,如下面的例子,可以发现直接报错了。
mysql> update user set id =2 where id =1; Cannot delete or update a parent row: a foreign key constraint fails (`t`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `user` (`id`)
MySQL提供了几个约束可以帮助我们解决这类问题,比如在user表更新时,orders也相继更新。
RESTRICT:如果子表中有记录,则拒绝更新或删除父表中的记录。
CASCADE:更新或删除父表中的记录时,自动更新或删除子表中的记录。
SET NULL:在更新或删除父表记录时,将子表中字段的值设置为空。
可以发现,默认采用的是RESTRICT,下面来修改一下,让在更新时候也同样更新,在删除时候设置null。
mysql> alter table orders add constraint orders_ibfk_1 FOREIGN KEY (`userId`) REFERENCES `user` (`id`) on update cascade on delete set null; Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0
测试更新
mysql> select * from user; +----+--------+ | id | name | +----+--------+ | 1 | 张三 | +----+--------+ 1 row in set (0.00 sec) mysql> select * from orders; Empty set (0.00 sec) mysql> insert orders values (1,1); Query OK, 1 row affected (0.01 sec) mysql> update user set id =2 where id =1; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from orders; +----+--------+ | id | userId | +----+--------+ | 1 | 2 | +----+--------+ 1 row in set (0.01 sec)
测试删除。
mysql> delete from user where id =2; Query OK, 1 row affected (0.02 sec) mysql> select * from orders; +----+--------+ | id | userId | +----+--------+ | 1 | NULL | +----+--------+ 1 row in set (0.00 sec)
6.DEFAULT
DEFAULT
CHECK
: Stellen Sie sicher, dass der Wert in der Spalte bestimmte Bedingungen erfüllt
UNIQUE
: Stellen Sie sicher, dass alle Werte in einer Spalte unterschiedlich sindPRIMARY KEY
: Kombination ausNOT NULL
undUNIQUE
, eindeutiger Bezeichner für jede Zeile in der Tabelle
FOREIGN KEY
: FremdschlüsseleinschränkungDEFAULT
: Wenn kein Wert angegeben ist , legen Sie den Standardwert für die Spalte fest li>【Verwandte Empfehlungen: MySQL-Video-Tutorial
】
Einschränkungen
1.NULL strong>
Verwenden Sie in MySQL NOT NULL. Stellen Sie sicher, dass beim Erstellen der Tabelle keine Nullwerte angezeigt werden. Das Format lautet wie folgt: mysql> create table user(age int(11) default 18);
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> insert user values();
Query OK, 1 row affected (0.02 sec)
mysql> select * from user;
+------+
| age |
+------+
| 18 |
+------+
1 row in set (0.00 sec)
Wenn Sie es versuchen Um einen Nullwert einzufügen, wird eine Ausnahme ausgelöst.
NOT NULL
-Einschränkung für die vorhandene Tabelle hinzu. 🎜rrreee🎜Entfernen Sie die NOT NULL
-Einschränkung. 🎜rrreee2.CHECK
🎜Wenn Sie bedingte Einschränkungen für die Spalte definieren möchten, können Sie CHECK wie folgt verwenden: um zu erzwingen, dass das Altersfeld größer als 18 und kleiner als 80 ist, andernfalls wird ein Fehler gemeldet. 🎜rrreee🎜Einfügetest, Sie können feststellen, dass 9 und 81 beim Einfügen Ausnahmen auslösen. 🎜rrreee🎜Sie können auch mehrspaltige Einschränkungen durchführen, z. B. das Alter muss größer als 18 sein und die Stadt muss China sein. 🎜rrreee🎜Test einfügen. 🎜rrreee🎜 Sie können auch angeben, dass der Spaltenwert im angegebenen Satz enthalten sein muss, beispielsweise muss das Geschlecht in den Sätzen „männlich“, „weiblich“, „unbekannt“ und „Shemale“ enthalten sein. 🎜rrreee🎜Test einfügen. 🎜rrreee🎜Benennen Sie Einschränkungen und löschen Sie Einschränkungen. 🎜rrreee🎜Aber haben Sie es jemals so geschrieben gesehen? 🎜🎜Raten Sie mal, was die Funktion unten ist. 🎜🎜Dies ist tatsächlich ein Fall einer bedingten Beurteilung, die nur das Einfügen von >=18 oder einer Zahl zwischen 0 und 10 ermöglicht. 🎜rrreee3.UNIQUE
🎜UNIQUE
-Einschränkung stellt sicher, dass die Spalte keine doppelten Werte enthält , Sowohl die Einschränkungen UNIQUE
als auch PRIMARY KEY
bieten Garantien für die Eindeutigkeit eines Spaltenwerts, aber UNIQUE
kann in jeder Tabelle mehrmals vorkommen, während PRIMARY KEY erscheinen. 🎜🎜Zum Beispiel kann das Namensfeld unten nicht wiederholt werden. 🎜rrreee🎜Test einfügen. 🎜rrreee🎜Nennen Sie diese Einschränkung und löschen Sie sie. 🎜rrreee🎜Nach dem Einfügen können Sie die folgende Anweisung verwenden, um die Erstellungsanweisung anzuzeigen. 🎜rrreee🎜Um eine UNIQUE
-Einschränkung zu löschen, können Sie die Anweisung DROP INDEX
oder ALTER TABLE
verwenden: 🎜rrreee🎜add auf einer vorhandenen Tabelle. 🎜rrreee4.PRIMARY KEY
🎜Normalerweise enthält jede Tabelle einen Wert, der jede Zeile eindeutig identifiziert, und diese Spalte wird PRIMARY KEY genannt. 🎜rrreee5.FOREIGN KEY
🎜FOREIGN KEY
wird verwendet, um einzuschränken, dass ein Feld in der Tabelle vorhanden sein muss sei ein anderer Der Wert, der in einem bestimmten Feld in einer Tabelle vorhanden ist, aber in einer anderen Tabelle ist diese Spalte nicht unbedingt der Primärschlüssel, sondern muss ein eindeutiger Index sein, sonst schlägt die Erstellung fehl. 🎜🎜Zum Beispiel muss die Benutzer-ID in der Bestelltabelle auf die ID in der Benutzertabelle verweisen. Wenn die eingefügte Benutzer-ID nicht in der Benutzertabelle vorhanden ist, kann sie nicht eingefügt werden. 🎜rrreee🎜Aber es gibt ein Problem, wenn die Datensätze in der Haupttabelle (Benutzer) gelöscht oder aktualisiert werden. Was soll dann mit den Datensätzen in Bestellungen geschehen? , wie im Beispiel unten, können Sie feststellen, dass ein Fehler direkt gemeldet wird. 🎜rrreee🎜MySQL bietet mehrere Einschränkungen, die uns bei der Lösung dieser Art von Problemen helfen. Wenn beispielsweise die Benutzertabelle aktualisiert wird, werden auch Bestellungen nacheinander aktualisiert. 🎜- 🎜🎜RESTRICT: Weigern Sie sich, Datensätze in der übergeordneten Tabelle zu aktualisieren oder zu löschen, wenn Datensätze in der untergeordneten Tabelle vorhanden sind. 🎜🎜🎜CASCADE: Datensätze in der untergeordneten Tabelle automatisch aktualisieren oder löschen, wenn Datensätze in der übergeordneten Tabelle aktualisiert oder gelöscht werden. 🎜🎜🎜SET NULL: Setzt den Wert des Felds in der untergeordneten Tabelle auf Null, wenn Datensätze der übergeordneten Tabelle aktualisiert oder gelöscht werden. 🎜
6.DEFAULT
🎜DEFAULT
-Einschränkung wird verwendet, um einen Standardwert für eine Spalte festzulegen Wenn einem Feld ein Wert zugewiesen wird, fügt das System automatisch einen Standardwert für dieses Feld ein. Keine Zuweisung bedeutet, dass dieses Feld beim Einfügen von Daten nicht angegeben wird am Ende. 🎜rrreee🎜🎜Originaladresse: https://juejin.cn/post/7000352993572814885🎜🎜Autor: i Listen to the Wind Passing Night🎜🎜🎜Weitere Programmierkenntnisse finden Sie unter: 🎜Programmiervideo🎜! ! 🎜Das obige ist der detaillierte Inhalt vonEine ausführliche Analyse der 6 gängigen Einschränkungstypen in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

在mysql中,可利用“ALTER TABLE 表名 DROP INDEX unique key名”语句来删除unique key;ALTER TABLE语句用于对数据进行添加、删除或修改操作,DROP INDEX语句用于表示删除约束操作。


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

Dreamweaver Mac
Visuelle Webentwicklungstools