04
04
04
4.5 - Consider the database shown in Figure 1.2, whose schema is shown in Figure 2.1.
What are the referential integrity constraints that should hold on the schema?
Write appropriate SQL DDL statements to define the database.
Answer:
The following referential integrity constraints should hold (we use the notation:
R.(A1, ..., An) --> S.(B1, ..., Bn)
to represent a foreign key from the attributes A1, ..., An of R (the referencing relation)
to S (the referenced relation)):
PREREQUISITE.(CourseNumber) --> COURSE.(CourseNumber)
PREREQUISITE.(PrerequisiteNumber) --> COURSE.(CourseNumber)
SECTION.(CourseNumber) --> COURSE.(CourseNumber)
GRADE_REPORT.(StudentNumber) --> STUDENT.(StudentNumber)
GRADE_REPORT.(SectionIdentifier) --> SECTION.(SectionIdentifier)
One possible set of CREATE TABLE statements to define the database is given below.
CREATE TABLE STUDENT ( Name VARCHAR(30) NOT NULL,
StudentNumber INTEGER NOT NULL,
Class CHAR NOT NULL,
Major CHAR(4),
PRIMARY KEY (StudentNumber) );
CREATE TABLE COURSE ( CourseName VARCHAR(30) NOT NULL,
CourseNumber CHAR(8) NOT NULL,
CreditHours INTEGER,
Department CHAR(4),
PRIMARY KEY (CourseNumber),
UNIQUE (CourseName) );
CREATE TABLE PREREQUISITE ( CourseNumber CHAR(8) NOT NULL,
PrerequisiteNumber CHAR(8) NOT NULL,
PRIMARY KEY (CourseNumber, PrerequisiteNumber),
FOREIGN KEY (CourseNumber) REFERENCES
COURSE (CourseNumber),
FOREIGN KEY (PrerequisiteNumber) REFERENCES
COURSE (CourseNumber) );
CREATE TABLE SECTION ( SectionIdentifier INTEGER NOT NULL,
CourseNumber CHAR(8) NOT NULL,
Semester VARCHAR(6) NOT NULL,
Year CHAR(4) NOT NULL,
Instructor VARCHAR(15),
PRIMARY KEY (SectionIdentifier),
FOREIGN KEY (CourseNumber) REFERENCES
COURSE (CourseNumber) );
CREATE TABLE GRADE_REPORT ( StudentNumber INTEGER NOT NULL,
SectionIdentifier INTEGER NOT NULL,
Grade CHAR,
PRIMARY KEY (StudentNumber, SectionIdentifier),
FOREIGN KEY (StudentNumber) REFERENCES
STUDENT (StudentNumber),
FOREIGN KEY (SectionIdentifier) REFERENCES
SECTION (SectionIdentifier) );
4.6 - Repeat Exercise 4.5, but use the AIRLINE schema of Figure 3.8.
Answer:
ScholarStock
2 Chapter 4: Basic SQL
ScholarStock
Chapter 4: Basic SQL 3
4.7 - Consider the LIBRARY relational database schema of Figure 4.6. Choose the
appropriate action (reject, cascade, set to null, set to default) for each referential integrity
constraint, both for the deletion of a referenced tuple, and for the update of a primary key
attribute value in a referenced tuple. Justify your choices.
Answer:
Below are possible choices. In general, if it is not clear which action to choose, REJECT
should be chosen, since it will not permit automatic changes to happen (by update
propagation) that may be unintended.
BOOK_AUTHORS.(BookId) --> BOOK.(BookId)
CASCADE on both DELETE or UPDATE (since this corresponds to a multi-valued attribute
of BOOK (see the solution to Exercise 6.27); hence, if a BOOK is deleted, or the value of
its BookId is updated (changed), the deletion or change is automatically propagated to the
referencing BOOK_AUTHORS tuples)
BOOK.(PublisherName) --> PUBLISHER.(Name)
REJECT on DELETE (we should not delete a PUBLISHER tuple which has existing BOOK
tuples that reference the PUBLISHER)
CASCADE on UPDATE (if a PUBLISHER's Name is updated, the change should be
propagated automatically to all referencing BOOK tuples)
BOOK_LOANS.(BookId) --> BOOK.(BookId)
CASCADE on both DELETE or UPDATE (if a BOOK is deleted, or the value of its BookId is
updated (changed), the deletion or change is automatically propagated to the referencing
BOOK_LOANS tuples) (Note: One could also choose REJECT on DELETE)
BOOK_COPIES.(BookId) --> BOOK.(BookId)
CASCADE on both DELETE or UPDATE (if a BOOK is deleted, or the value of its BookId is
updated (changed), the deletion or change is automatically propagated to the referencing
ScholarStock
4 Chapter 4: Basic SQL
BOOK_COPIES tuples)
BOOK_LOANS.(CardNo) --> BORROWER.(CardNo)
CASCADE on both DELETE or UPDATE (if a BORROWER tuple is deleted, or the value of
its CardNo is updated (changed), the deletion or change is automatically propagated to the
referencing BOOK_LOANS tuples) (Note: One could also choose REJECT on DELETE, with
the idea that if a BORROWER is deleted, it is necessary first to make a printout of all
BOOK_LOANS outstanding before deleting the BORROWER; in this case, the tuples in
BOOK_LOANS that reference the BORROWER being deleted would first be explicitly
deleted after making the printout, and before the BORROWER is deleted)
BOOK_COPIES.(BranchId) --> LIBRARY_BRANCH.(BranchId)
CASCADE on both DELETE or UPDATE (if a LIBRARY_BRANCH is deleted, or the value of
its BranchId is updated (changed), the deletion or change is automatically propagated to
the referencing BOOK_COPIES tuples) (Note: One could also choose REJECT on DELETE)
BOOK_LOANS.(BranchId) --> LIBRARY_BRANCH.(BranchId)
CASCADE on both DELETE or UPDATE (if a LIBRARY_BRANCH is deleted, or the value of
its BranchId is updated (changed), the deletion or change is automatically
propagated to the referencing BOOK_LOANS tuples) (Note: One could also choose
REJECT on DELETE)
4.8 - Write appropriate SQL DDL statements for declaring the LIBRARY relational database
schema of Figure 4.6. Specify the keys and referential triggered actions.
Answer:
One possible set of CREATE TABLE statements is given below:
CREATE TABLE BOOK ( BookId CHAR(20) NOT NULL,
Title VARCHAR(30) NOT NULL,
PublisherName VARCHAR(20),
PRIMARY KEY (BookId),
FOREIGN KEY (PublisherName) REFERENCES PUBLISHER (Name) ON UPDATE
CASCADE );
CREATE TABLE BOOK_AUTHORS ( BookId CHAR(20) NOT NULL,
AuthorName VARCHAR(30) NOT NULL,
PRIMARY KEY (BookId, AuthorName),
FOREIGN KEY (BookId) REFERENCES BOOK (BookId)
ON DELETE CASCADE ON UPDATE CASCADE );
CREATE TABLE PUBLISHER ( Name VARCHAR(20) NOT NULL,
Address VARCHAR(40) NOT NULL,
Phone CHAR(12),
PRIMARY KEY (Name) );
CREATE TABLE BOOK_COPIES ( BookId CHAR(20) NOT NULL,
BranchId INTEGER NOT NULL,
No_Of_Copies INTEGER NOT NULL,
PRIMARY KEY (BookId, BranchId),
FOREIGN KEY (BookId) REFERENCES BOOK (BookId)
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (BranchId) REFERENCES BRANCH (BranchId)
ON DELETE CASCADE ON UPDATE CASCADE );
CREATE TABLE BORROWER ( CardNo INTEGER NOT NULL,
Name VARCHAR(30) NOT NULL,
Address VARCHAR(40) NOT NULL,
Phone CHAR(12),
PRIMARY KEY (CardNo) );
CREATE TABLE BOOK_LOANS ( CardNo INTEGER NOT NULL,
ScholarStock
Chapter 4: Basic SQL 5
4.9 - How can the key and foreign key constraints be enforced by the DBMS? Is the
enforcement technique you suggest difficult to implement? Can the constraint checks be
executed in an efficient manner when updates are applied to the database?
Answer:
One possible technique that is often used to check efficiently for the key constraint
is to create an index on the combination of attributes that form each key (primary or
secondary). Before inserting a new record (tuple), each index is searched to check that
no value currently exists in the index that matches the key value in the new record. If
this is the case, the record is inserted successfully.
For checking the foreign key constraint, an index on the primary key of each
referenced relation will make this check relatively efficient. Whenever a new record is
inserted in a referencing relation , its foreign key value is used to search the index for
the primary key of the referenced relation, and if the referenced record exists, then the
new record can be successfully inserted in the referencing relation.
For deletion of a referenced record, it is useful to have an index on the foreign key
of each referencing relation so as to be able to determine efficiently whether any records
reference the record being deleted.
If the indexes described above do not exist, and no alternative access structure (for
example, hashing) is used in their place, then it is necessary to do linear searches to
check for any of the above constraints, making the checks quite inefficient.
4.11 - Specify the updates of Exercise 3.11 using the SQL update commands.
Answers:
Below, we show how each of the updates may be specified in SQL. Notice that some of
these updates violate integrity constraints as discussed in the solution to Exercise 5.10,
and hence should be rejected if executed on the database of Figure 5.6.
(a) Insert < 'Robert', 'F', 'Scott', '943775543', '21-JUN-42', '2365 Newcastle Rd,
Bellaire, TX', M, 58000, '888665555', 1 > into EMPLOYEE.
INSERT INTO EMPLOYEE
VALUES ('Robert', 'F', 'Scott', '943775543', '21-JUN-42', '2365 Newcastle Rd, Bellaire, TX',
M, 58000, '888665555', 1)
ScholarStock
6 Chapter 4: Basic SQL
(e) Insert < '453453453', 'John', M, '12-DEC-60', 'SPOUSE' > into DEPENDENT.
INSERT INTO DEPENDENT
VALUES ('453453453', 'John', M, '12-DEC-60', 'SPOUSE')
(i) Modify the MGRSSN and MGRSTARTDATE of the DEPARTMENT tuple with DNUMBER=
5 to '123456789' and '01-OCT-88', respectively.
UPDATE DEPARTMENT
SET MGRSSN = '123456789', MGRSTARTDATE = '01-OCT-88'
WHERE DNUMBER= 5
(j) Modify the SUPERSSN attribute of the EMPLOYEE tuple with SSN= '999887777' to
'943775543'.
UPDATE EMPLOYEE
SET SUPERSSN = '943775543'
WHERE SSN= '999887777'
(k) Modify the HOURS attribute of the WORKS_ON tuple with ESSN= '999887777' and
PNO= 10 to '5.0'.
UPDATE WORKS_ON
SET HOURS = '5.0'
WHERE ESSN= '999887777' AND PNO= 10
4.12 - Specify the following queries in SQL on the database schema of Figure 1.2.
(a) Retrieve the names of all senior students majoring in 'COSC' (computer science).
(b) Retrieve the names of all courses taught by professor King in 85 and 86.
(c) For each section taught by professor King, retrieve the course number, semester,
year, and number of students who took the section.
ScholarStock
Chapter 4: Basic SQL 7
(d) Retrieve the name and transcript of each senior student (Class=5) majoring in
COSC. Transcript includes course name, course number, credit hours, semester, year,
and grade for each course completed by the student.
(e) Retrieve the names and major departments of all straight A students (students who
have a grade of A in all their courses).
(f) Retrieve the names and major departments of all students who do not have any grade
of A in any of their courses.
Answers:
(a) SELECT Name
FROM STUDENT
WHERE Major='COSC'
4.13 - Write SQL update statements to do the following on the database schema shown in
Figure 1.2.
ScholarStock
8 Chapter 4: Basic SQL
(d) Delete the record for the student whose name is 'Smith' and student number is 17.
Answers:
(a) INSERT INTO STUDENT
VALUES ('Johnson', 25, 1, 'MATH')
4.15 - Consider the EMPLOYEE table’s constraint EMPSUPERFK as specified in Figure 4.2
is changed to read as follows:
CONSTRAINT EMPSUPERFK
FOREIGN KEY (SUPERSSN) REFERNCES EMPLOYEE(SSN)
ON DELETE CASCADE ON UPDATE CASCADE,
Answer the following questions:
a. What happens when the following command is run on the database state shown in
Figure 5.6?
DELETE EMPLOYEE WHERE LNAME = ‘Borg’
b. Is it better to CASCADE or SET NULL in case of EMPSUPERFK constraint ON
DELETE?
Answers:
a) The James E. Borg entry is deleted from the table, and each employee with him as a
supervisor is also (and their supervisees, and so on). In total, 8 rows are deleted and the
table is empty.
b) It is better to SET NULL, since an employee is not fired (DELETED) when their
supervisor is deleted. Instead, their SUPERSSN should be SET NULL so that they can later
get a new supervisor.
Answer:
INSERT INTO EMPLOYEE_BACKUP VALUES ( SELECT * FROM EMPLOYEE )
ScholarStock