Upload
harish-gyanani
View
441
Download
2
Embed Size (px)
DESCRIPTION
MySQL constraints with features and examples
Citation preview
MySQL ConstraintsPresented By Harish Gyanani
Foreign key exercises included
What is Constraint??
Constraints are used to specify rules for the data in a table.
If there is any violation between the constraint and the data action, the action is aborted by the constraint.
Constraints can be specified when the table is created (inside the CREATE TABLE statement) or after the table is created (inside the ALTER TABLE statement).
Types of ConstraintsNOT NULL
DEFAULT
UNIQUE
Check
Primary Key
Foreign Key
NOT NULL
The NOT NULL constraint enforces a column to NOT accept NULL values.
It enforces a field to always contain a value. This means that you cannot insert a new record, or update a record without adding a value to this field.
NOT NULL
• While creating table• After creating table
Set NOT NULL constraint
Verify NOT NULL in table structure
Try to skip the NOT NULL column in INSERT INTO query
Find what is stored, when we skip NOT NULL column values
Try another ways to insert null into not null column
DROP NOT NULL Constraint from Column
Set NOT NULL constraint
While creating table
After creating table
Set NOT NULL Constraint
mysql> create table table1
-> (
-> rollno int,
-> name varchar(20) not null
-> );
Query OK, 0 rows affected (0.20 sec)
(While Creating Table)
Set NOT NULL Constraint
mysql> alter table table1
-> modify name varchar(20) not null;
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
(After Creating Table)
1. Verify NOT NULL in Table Structure
NULL value not allowed in name column
Try to enter Null value in name column
mysql> show warnings;
+---------+------+-------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------+
| Warning | 1364 | Field 'name' doesn't have a default value |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)
Display Warning-
What has been Stored by Table???.1
What has been Stored by Table???.2
mysql> select * from table1;
+--------+------+
| rollno | name |
+--------+------+
| 1 | |
+--------+------+
1 row in set (0.00 sec)
Still not clear what is stored by Table in Name column
What has been Stored by Table???.3
mysql> select length(name)
-> from table1;
+--------------+
| length(name) |
+--------------+
| 0 |
+--------------+
1 row in set (0.02 sec)
Table stored empty string
BECAUSE if it is NULL; length function would have returned NULL
Another way to check table has stored empty String in not null column.1
mysql> select * from table1 -> where name is null;Empty set (0.01 sec)
BECAUSE table has stored empty string instead of null
null != empty String (null is not equal to empty string )
Another way to check table has stored empty String in not null column.1
mysql> select * from table1 -> where name ='';+--------+------+| rollno | name |+--------+------+| 1 | |+--------+------+1 row in set (0.00 sec)
Hence Proved table has Stored empty String
Conclusion: - MySQL has stored empty string because it cannot store NULL
MySQL Stores these values when user doesn’t provide value and column cannot store NULL; They are not equivalent to NULL
String ‘’(empty string)
Number 0
Date 0000-00-00
time 00:00:00
Another ways to Insert NULL value.1
mysql> insert into table1(name) -> values(NULL);ERROR 1048 (23000): Column 'name' cannot be null
Another ways to Insert NULL value.2
mysql> insert into table1 -> values(23,NULL);ERROR 1048 (23000): Column 'name' cannot be null
Another ways to Insert NULL value.3
mysql> insert into table1 -> values(23);ERROR 1136 (21S01): Column count doesn't match value count at row 1
Another ways to Insert NULL value.4
mysql> insert into table1(rollno,name) -> values(456);ERROR 1136 (21S01): Column count doesn't match value count at row 1
DEFAULT
The DEFAULT constraint is used to insert a default value into a column.
The default value will be added to all new records, if no other value is specified.
Set DEFAULT constraint
• While creating table• After creating table
Verify DEFAULT in table structure
Try to skip rollno column value in INSERT INTO
Find what is stored, when we skip NOT NULL column values
Try another ways to insert null into not null column
DEFAULT
Set DEFAULT Constraint
While creating table
After creating table
Set DEFAULT Constraint
mysql> create table table1 -> ( -> rollno int default 500, -> name varchar(20) -> );Query OK, 0 rows affected (0.08 sec)
(While Creating Table)
Set DEFAULT Constraint
mysql> alter table table1 -> alter rollno -> set default 500;
Query OK, 0 rows affected (0.03 sec)Records: 0 Duplicates: 0 Warnings: 0
(After Creating Table)
Verify DEFAULT in Table Structure
mysql> DESC table1;+--------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| rollno | int(11) | YES | | 500 | || name | varchar(20) | YES | | NULL | |+--------+-------------+------+-----+---------+-------+2 rows in set (0.03 sec)
DEFAULT value for rollno column is 500
Instead of null value, default value 500 is stored
Try to skip rollno column value in INSERT INTO
mysql> INSERT INTO table1(name) -> VALUES('harish');
Query OK, 1 row affected (0.03 sec)
What has been Stored by Table???
Simple!!! The DEFAULT valuemysql> SELECT * FROM table1;+--------+--------+| rollno | name |+--------+--------+| 500 | harish |+--------+--------+1 row in set (0.00 sec)
Default Value 500 is Stored when we did not specify any value
What happens when we specify a value????
mysql> INSERT INTO table1 -> VALUES(1,'ramesh');
Query OK, 1 row affected (0.03 sec)
Simple !!! The Specified value is Storedmysql> SELECT * FROM table1;+--------+--------+| rollno | name |+--------+--------+| 500 | harish || 1 | ramesh |+--------+--------+2 rows in set (0.00 sec)
The specified value in INSERT INTO statement is stored
What happens when we store null in rollno column???
mysql> insert into table1 -> values(NULL,'suresh');Query OK, 1 row affected (0.07 sec)
NULL is stored but why???
mysql> select * from table1;+--------+--------+| rollno | name |+--------+--------+| 500 | harish || 1 | ramesh || NULL | suresh |+--------+--------+3 rows in set (0.00 sec)
NULL can be stored with DEFAULT constraint column
Because…..mysql> desc table1;+--------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| rollno | int(11) | YES | | 500 | || name | varchar(20) | YES | | NULL | |+--------+-------------+------+-----+---------+-------+2 rows in set (0.03 sec)
NULL is allowed
What happens when we Do not specify any value????
mysql> insert into table1() -> values();Query OK, 1 row affected (0.03 sec)
Simple!!! Default values are storedmysql> select * from table1;+--------+--------+| rollno | name |+--------+--------+| 500 | harish || 1 | ramesh || NULL | suresh || 500 | NULL |+--------+--------+4 rows in set (0.00 sec)
Rollno has default value 500, that’s why it is stored
NULL is stored because it is-1. Default value for this column2. NULL is allowed
Can we specify DEFAULT constraint in filled table???
Yes!!! We can
When we add DEFAULT Constraint in a Filled Column,No Old Values are altered
How to Drop DEFAULT??
mysql> alter table table1 -> alter rollno -> drop default;
Query OK, 0 rows affected (0.08 sec)Records: 0 Duplicates: 0 Warnings: 0
Verify, DEFAULT Dropped or Not….
mysql> desc table1;+--------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| rollno | int(11) | YES | | NULL | || name | varchar(20) | YES | | NULL | |+--------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)
NO Default value, Only NULL
Returned Back to NULL, like other columns
Foreign Key
What is Foreign key?1. A foreign key is a field (or collection of fields) in one table that uniquely
identifies a row of another table.2. In other words, a foreign key is a column or a combination of columns
that is used to establish and enforce a link between two tables.3. The table containing the foreign key is called the referencing or child
table, and the table containing the candidate key is called the referenced or parent table.
4. A FOREIGN KEY in one table points to a PRIMARY KEY in another table.5. The FOREIGN KEY constraint also prevents invalid data from being
inserted into the foreign key column, because it has to be one of the values contained in the table it points to.
6. A table can contain more than one foreign key.7. This is sometimes called a referencing key.
Example ScenarioFor example, consider a database with two tables: a CUSTOMER table that includes all customer data and an ORDER table that includes all customer orders. Suppose the business requires that each order must refer to a single customer. To reflect this in the database, a foreign key column is added to the ORDER table (e.g., CUSTOMERID), which references the primary key of CUSTOMER (e.g. ID). Because the primary key of a table must be unique, and because CUSTOMERID only contains values from that primary key field, we may assume that, when it has a value, CUSTOMERID will identify the particular customer which placed the order.
Example 2
P_Id LastName FirstName Address City
1 Hansen Ola Timoteivn 10
Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger
O_Id OrderNo P_Id
1 77895 3
2 44678 3
3 22456 2
4 24562 1
Persons table
Orders table
P_id column is common in these tables. P_id is primary key in persons table. The other way to check is, p_id values are not unique in orders table. It means persons table which contains p_id as primary key is parent table and orders table is child table.
Example 3Student Table
Course Table
Course table is parent because courseid is primary key in course table.
Example 4
City table is parent because cityid is primary key in course table.
Example 5
Contact table is parent because contact_id is primary key in contact table. Address and telephone tables are children.
You must have a contact before an address or telephone number.
Address table is parent because address_id is primary key in address table. Telephone table is child.
Example 6
Example 7
Example 8
Exercise 1
Exercise 2
Exercise 3
Exercise 4
Exercise 5
Exercise 6
Exercise 7+------+--------+-----------+| sid | sname | branch_no |+------+--------+-----------+| s001 | Ram | br001 || s002 | Shyam | br001 || s003 | Sita | br002 || s004 | Geeta | br003 || s005 | Naresh | br002 |+------+--------+-----------+
+-----------+-------------+| branch_no | branch_name |+-----------+-------------+| br001 | IT || br002 | CSE || br003 | ECE |+-----------+-------------+
Student table
Branch table
How to add foreign key in MySQL/Oracle
While creating tableSyntax-CONSTRAINT <constraint_name>FOREIGN KEY(<column name of this/child table>) REFERENCES <Parent Table Name> (<column name of parent table>)
Example-CREATE TABLE Orders(O_Id int NOT NULL,OrderNo int NOT NULL,P_Id int,PRIMARY KEY (O_Id),CONSTRAINT fk_PerOrdersFOREIGN KEY (P_Id)REFERENCES Persons(P_Id))
How to add foreign key in MySQL/Oracle
After creating tableSyntax-ALTER TABLE <child table name>ADD CONSTRAINT <constraint_name>FOREIGN KEY(<column name of this/child table>) REFERENCES <Parent Table Name> (<column name of parent table>);
Example-ALTER TABLE OrdersADD CONSTRAINT fk_PerOrdersFOREIGN KEY (P_Id)REFERENCES Persons(P_Id);
How to check foreign keys in a table
mysql> DESC orders;+---------+---------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+---------+------+-----+---------+-------+| O_Id | int(11) | NO | PRI | NULL | || OrderNo | int(11) | NO | | NULL | || P_Id | int(11) | YES | MUL | NULL | |+---------+---------+------+-----+---------+-------+
This shows a foreign key constraint is set to p_id column in orders table.
But Where are the Details???Its parent table?Linked column in parent table?
Check full details of foreign keysmysql> SHOW CREATE TABLE orders;
| Table | Create Table--------------------------------------------------------+| orders | CREATE TABLE `orders` ( `O_Id` int(11) NOT NULL, `OrderNo` int(11) NOT NULL, `P_Id` int(11) DEFAULT NULL, PRIMARY KEY (`O_Id`), KEY `fk_PerOrders` (`P_Id`), CONSTRAINT `fk_PerOrders` FOREIGN KEY (`P_Id`) REFERENCES `persons` (`p_id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 |+--------+----------------------------------------------------------------------
Foreign key constraint name
Column of this table Parent table nameColumn in
parent table
Drop Foreign key in MySQL/OracleMySQL Oracle
Syntax-ALTER TABLE <child table name>DROP FOREIGN KEY <constraint name>;
Syntax-ALTER TABLE <child table name>DROP CONSTRAINT <constraint name>;
Example-ALTER TABLE OrdersDROP FOREIGN KEY fk_PerOrders;
Example-ALTER TABLE OrdersDROP CONSTRAINT fk_PerOrders
References
• http://rdbms.opengrass.net/2_Database%20Design/2.1_TermsOfReference/2.1.2_Keys.html
• http://www.teach-ict.com/as_as_computing/ocr/H447/F453/3_3_9/dbkey/miniweb/pg3.htm
• http://databaserefactoring.com/AddForeignKey.html
• http://www.ssw.com.au/ssw/SQLAuditor/UserguideWizards.aspx
• http://www.cs.usfca.edu/~parrt/course/601/lectures/db.html
• http://www.teach-ict.com/as_a2_ict_new/ocr/AS_G061/315_database_concepts/terminology/miniweb/pg13.htm
• http://www.sparxsystems.com/enterprise_architect_user_guide/9.0/database_engineering/create_a_foreign_key.html