CONSTRAINT
FOREIGN KEY constraints
InnoDB supports foreign key constraints. The syntax for a foreign key constraint definition in InnoDB looks like this:
[CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION
CHECK constraint expressions
MariaDB starting with 10.2.1
MariaDB 10.2.1 now enforces constraints. Before MariaDB 10.2.1 constraint expressions were accepted in the syntax but ignored.
In MariaDB 10.2.1 you can define constraints in 2 different ways:
CHECK(expression)
given as part of a column definition.CONSTRAINT [constraint_name] CHECK (expression)
Before a row is inserted or updated, all constraints are evaluated in the order they are defined. If any constraints fails, then the row will not be inserted or updated. One can use most deterministic functions in a constraint, including UDFs.
create table t1 (a int check(a>0) ,b int check (b> 0), constraint abc check (a>b));
If you use the second format and you don't give a name to the constraint, then the constraint will get an automatically generated name. This is done so that you can later delete the constraint with ALTER TABLE DROP constraint_name.
One can disable all constraint expression checks by setting the check_constraint_checks variable to OFF
. This is useful for example when loading a table that violates some constraints that you want to later find and fix in SQL.
Examples
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB; CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, PRIMARY KEY(no), INDEX (product_category, product_id), FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB;