64
MySQL Constraints Presented By Harish Gyanani Foreign key exercises included

MySQL constraints

Embed Size (px)

DESCRIPTION

MySQL constraints with features and examples

Citation preview

Page 1: MySQL constraints

MySQL ConstraintsPresented By Harish Gyanani

Foreign key exercises included

Page 2: MySQL constraints

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).

Page 3: MySQL constraints

Types of ConstraintsNOT NULL

DEFAULT

UNIQUE

Check

Primary Key

Foreign Key

Page 4: MySQL constraints

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.

Page 5: MySQL constraints

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

Page 6: MySQL constraints

Set NOT NULL constraint

While creating table

After creating table

Page 7: MySQL constraints

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)

Page 8: MySQL constraints

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)

Page 9: MySQL constraints

1. Verify NOT NULL in Table Structure

NULL value not allowed in name column

Page 10: MySQL constraints

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-

Page 11: MySQL constraints

What has been Stored by Table???.1

Page 12: MySQL constraints

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

Page 13: MySQL constraints

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

Page 14: MySQL constraints

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 )

Page 15: MySQL constraints

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

Page 16: MySQL constraints

Conclusion: - MySQL has stored empty string because it cannot store NULL

Page 17: MySQL constraints

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

Page 18: MySQL constraints

Another ways to Insert NULL value.1

mysql> insert into table1(name) -> values(NULL);ERROR 1048 (23000): Column 'name' cannot be null

Page 19: MySQL constraints

Another ways to Insert NULL value.2

mysql> insert into table1 -> values(23,NULL);ERROR 1048 (23000): Column 'name' cannot be null

Page 20: MySQL constraints

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

Page 21: MySQL constraints

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

Page 22: MySQL constraints

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.

Page 23: MySQL constraints

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

Page 24: MySQL constraints

Set DEFAULT Constraint

While creating table

After creating table

Page 25: MySQL constraints

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)

Page 26: MySQL constraints

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)

Page 27: MySQL constraints

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

Page 28: MySQL constraints

Try to skip rollno column value in INSERT INTO

mysql> INSERT INTO table1(name) -> VALUES('harish');

Query OK, 1 row affected (0.03 sec)

Page 29: MySQL constraints

What has been Stored by Table???

Page 30: MySQL constraints

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

Page 31: MySQL constraints

What happens when we specify a value????

mysql> INSERT INTO table1 -> VALUES(1,'ramesh');

Query OK, 1 row affected (0.03 sec)

Page 32: MySQL constraints

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

Page 33: MySQL constraints

What happens when we store null in rollno column???

mysql> insert into table1 -> values(NULL,'suresh');Query OK, 1 row affected (0.07 sec)

Page 34: MySQL constraints

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

Page 35: MySQL constraints

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

Page 36: MySQL constraints

What happens when we Do not specify any value????

mysql> insert into table1() -> values();Query OK, 1 row affected (0.03 sec)

Page 37: MySQL constraints

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

Page 38: MySQL constraints

Can we specify DEFAULT constraint in filled table???

Page 39: MySQL constraints

Yes!!! We can

When we add DEFAULT Constraint in a Filled Column,No Old Values are altered

Page 40: MySQL constraints

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

Page 41: MySQL constraints

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

Page 42: MySQL constraints

Foreign Key

Page 43: MySQL constraints

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.

Page 44: MySQL constraints

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.

Page 45: MySQL constraints

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.

Page 46: MySQL constraints

Example 3Student Table

Course Table

Course table is parent because courseid is primary key in course table.

Page 47: MySQL constraints

Example 4

City table is parent because cityid is primary key in course table.

Page 48: MySQL constraints

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.

Page 49: MySQL constraints

Example 6

Page 50: MySQL constraints

Example 7

Page 51: MySQL constraints

Example 8

Page 52: MySQL constraints

Exercise 1

Page 53: MySQL constraints

Exercise 2

Page 54: MySQL constraints

Exercise 3

Page 55: MySQL constraints

Exercise 4

Page 56: MySQL constraints

Exercise 5

Page 57: MySQL constraints

Exercise 6

Page 58: MySQL constraints

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

Page 59: MySQL constraints

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))

Page 60: MySQL constraints

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);

Page 61: MySQL constraints

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?

Page 62: MySQL constraints

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

Page 63: MySQL constraints

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

Page 64: MySQL constraints

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