SQL/MySQL/Table Index/Constraint

Материал из SQL эксперт
Перейти к: навигация, поиск

Setting CHECK Constraints

/*
mysql> Drop TABLE Employee;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE Employee (
    ->    Name    VARCHAR(50) PRIMARY KEY NOT NULL,
    ->    PhoneNo VARCHAR(15) DEFAULT "Unknown Phone",
    ->    Age     INT CHECK (Age BETWEEN 20 and 30));
Query OK, 0 rows affected (0.07 sec)
mysql> Describe Employee;
+---------+-------------+------+-----+---------------+-------+
| Field   | Type        | Null | Key | Default       | Extra |
+---------+-------------+------+-----+---------------+-------+
| Name    | varchar(50) |      | PRI |               |       |
| PhoneNo | varchar(15) | YES  |     | Unknown Phone |       |
| Age     | int(11)     | YES  |     | NULL          |       |
+---------+-------------+------+-----+---------------+-------+
3 rows in set (0.00 sec)
mysql> INSERT INTO Employee (Name, Phone, Age) VALUES ("Joe Wang", "666 2323", 26
);
ERROR 1054 (42S22): Unknown column "Phone" in "field list"
mysql> INSERT INTO Employee (Name, Age) VALUES ("John Doe", 31);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO Employee (Name, Phone) VALUES ("Joe Wang", NULL);
ERROR 1054 (42S22): Unknown column "Phone" in "field list"
mysql> Select * from Employee;
+----------+---------------+------+
| Name     | PhoneNo       | Age  |
+----------+---------------+------+
| John Doe | Unknown Phone |   31 |
+----------+---------------+------+
1 row in set (0.00 sec)

*/
Drop TABLE Employee;       
       
CREATE TABLE Employee (
   Name    VARCHAR(50) PRIMARY KEY NOT NULL, 
   PhoneNo VARCHAR(15) DEFAULT "Unknown Phone",
   Age     INT CHECK (Age BETWEEN 20 and 30));
Describe Employee;
INSERT INTO Employee (Name, Phone, Age) VALUES ("Joe Wang", "666 2323", 26);
INSERT INTO Employee (Name, Age) VALUES ("John Doe", 31);
INSERT INTO Employee (Name, Phone) VALUES ("Joe Wang", NULL);
Select * from Employee;



Setting CHECK Constraints: age between

/*
mysql> Drop TABLE Employee;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE Employee (
    ->    Name    VARCHAR(50) PRIMARY KEY NOT NULL,
    ->    Phone   VARCHAR(15) DEFAULT "Unknown Phone",
    ->    Age     INT,
    ->    CONSTRAINT CheckAge CHECK (Age BETWEEN 20 and 30));
Query OK, 0 rows affected (0.05 sec)
mysql> Describe Employee;
+-------+-------------+------+-----+---------------+-------+
| Field | Type        | Null | Key | Default       | Extra |
+-------+-------------+------+-----+---------------+-------+
| Name  | varchar(50) |      | PRI |               |       |
| Phone | varchar(15) | YES  |     | Unknown Phone |       |
| Age   | int(11)     | YES  |     | NULL          |       |
+-------+-------------+------+-----+---------------+-------+
3 rows in set (0.00 sec)
mysql> INSERT INTO Employee (Name, Phone, Age) VALUES ("Joe Wang", "666 2323", 26
);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO Employee (Name, Age) VALUES ("John Doe", 31);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO Employee (Name, Phone) VALUES ("Joe Wang", NULL);
ERROR 1062 (23000): Duplicate entry "Joe Wang" for key 1
mysql> Select * from Employee;
+----------+---------------+------+
| Name     | Phone         | Age  |
+----------+---------------+------+
| Joe Wang  | 666 2323      |   26 |
| John Doe | Unknown Phone |   31 |
+----------+---------------+------+
2 rows in set (0.00 sec)

*/
Drop TABLE Employee;
CREATE TABLE Employee (
   Name    VARCHAR(50) PRIMARY KEY NOT NULL, 
   Phone   VARCHAR(15) DEFAULT "Unknown Phone",
   Age     INT,
   CONSTRAINT CheckAge CHECK (Age BETWEEN 20 and 30));
  
Describe Employee;
INSERT INTO Employee (Name, Phone, Age) VALUES ("Joe Wang", "666 2323", 26);
INSERT INTO Employee (Name, Age) VALUES ("John Doe", 31);
INSERT INTO Employee (Name, Phone) VALUES ("Joe Wang", NULL);
Select * from Employee;



Setting CHECK Constraints: character by character

/*
mysql> Drop TABLE Employee;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE Employee (
    ->    Name    VARCHAR(50) PRIMARY KEY NOT NULL,
    ->    PhoneNo VARCHAR(15) DEFAULT "Unknown Phone",
    ->    SSN     VARCHAR(15) NOT NULL,
    ->    CHECK (SSN LIKE "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]"));
Query OK, 0 rows affected (0.07 sec)
mysql> Describe Employee;
+---------+-------------+------+-----+---------------+-------+
| Field   | Type        | Null | Key | Default       | Extra |
+---------+-------------+------+-----+---------------+-------+
| Name    | varchar(50) |      | PRI |               |       |
| PhoneNo | varchar(15) | YES  |     | Unknown Phone |       |
| SSN     | varchar(15) |      |     |               |       |
+---------+-------------+------+-----+---------------+-------+
3 rows in set (0.01 sec)
mysql> INSERT INTO Employee (Name, Phone, SSN) VALUES ("Joe Wang", "666 2323", 22
2-22-2222);
ERROR 1054 (42S22): Unknown column "Phone" in "field list"
mysql> INSERT INTO Employee (Name, SSN) VALUES ("John Doe", 22-a2-2222);
ERROR 1054 (42S22): Unknown column "a2" in "field list"
mysql> INSERT INTO Employee (Name, Phone) VALUES ("Joe Wang", NULL);
ERROR 1054 (42S22): Unknown column "Phone" in "field list"
mysql> Select * from Employee;
Empty set (0.00 sec)

*/
Drop TABLE Employee;

CREATE TABLE Employee (
   Name    VARCHAR(50) PRIMARY KEY NOT NULL, 
   PhoneNo VARCHAR(15) DEFAULT "Unknown Phone",
   SSN     VARCHAR(15) NOT NULL,
   CHECK (SSN LIKE "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]"));
Describe Employee;
INSERT INTO Employee (Name, Phone, SSN) VALUES ("Joe Wang", "666 2323", 222-22-2222);
INSERT INTO Employee (Name, SSN) VALUES ("John Doe", 22-a2-2222);
INSERT INTO Employee (Name, Phone) VALUES ("Joe Wang", NULL);
Select * from Employee;