בפוסט הזה, הממשיך את קודמו בנושא ה DDL אנו נתמקד בשינויים אשר אנו יכולים לבצע על שלד הטבלה (כגון הוספת עמודה מחיקת עמודה שינוי סוג עמודה הוספת אילוץ ועוד ), כיצד ניתן למחוק הטבלה כליל או רק את תוכנה.
פקודות אלו מאפשרות לנו לשנות את מבנה הטבלה לאחר שיצרנו אותה.
ALTER TABLE שם_טבלה ADD (שם_עמודה סוג_עמודה [DEFAULT ערך] , … )
דוגמא :
ALTER TABLE emps ADD (emp_manager NUMBER(3) DEFAULT 100)
v לא ניתן להגדיר היכן תמוקם העמודה החדשה מיקומה תמיד יהיה האחרון.
v אם הטבלה מכילה כבר עמודות עם ערכים, העמודה החדשה תאותחל בערכי NULL עבור כל אותן שורות.
ALTER TABLE שם_טבלה
MODIFY(שם_עמודה סוג_עמודה [DEFAULT ערך] , … )
דוגמא :
ALTER TABLE emps ADD (emp_manager NUMBER(3) DEFAULT 200)
v על מנת לשנות את סוג העמודה, העמודה חייבת להיות ריקה מערכים.
v על מנת להקטין את גודל העמודה, העמודה חייבת להיות ריקה מערכים.
v שינוי ערך הדיפולט של עמודה ישפיע רק על הערכים הבאים אשר יכנסו לתוכה.
ALTER TABLE emps DROP (עמודה)
דוגמא :
ALTER TABLE emps DROP (emp_manager)
v ניתן למחוק עמודה אשר מכילה או לא מכילה ערכים.
v באמצעות פקודה זו ניתן למחוק כל פעם עמודה בודדת.
v במידה והטבלה מורכבת מעמודה אחת, לא ניתן למחוק אותה ע"י פקודה זו.
SET UNUSED – סימון עמודות למחיקה עתידית
באמצעות פקודה זו אנו מסמנים עמודות מסויימות אשר נרצה למחוק בשלב מאוחר יותר :
ALTER TABLE שם_טבלה SET UNUSED (שם_עמודה)
או
ALTER TABLE שם_טבלה SET UNUSED COLUMN שם_עמודה
לדוגמא :
ALTER TABLE emps SET UNUSED (emp_manager)
מחיקת עמודה מטבלה עלולה להיות פעולה אשר לוקחת זמן רב במקרים מסויימים. ע"י פקודת SET UNUSED אנו מסמנים עמודה אחת או יותר כעמודות אשר יש למחוק בשלב מאוחר יותר ומבצעים את המחיקה כאשר תנאי השרת יותר אופטימליים.
על אף שעמודות אלו לא באמת נמחקות באמצעות פקודת SET UNUSED והזכרון אשר תופסות עמודות אלו לא משתחרר, לא יהיה ניתן לראות אותן ע"י פקודת SELECT או פקודת ה DESC.
אף יהיה ניתן להוסיף עמודה חדשה באותו שם כמו העמודה שסימנו כמיועדת למחיקה.
DROP UNUSED COLUMNS– מחיקת עמודות המסומנות כמחוקות
על מנת למחוק עמודות אשר סומנו למחיקה עתידית אנו נשתמש בפקודה :
ALTER TABLE שם_טבלה DROP UNUSED COLUMNS
ALTER TABLE שם_טבלה RENAME COLUMN שם_עמודה TO שם_עמודה_חדש
לדוגמא :
ALTER TABLE emps RENAME COLUMN emp_manager TO manager_id
RENAME שם_טבלה TO שם_טבלה_חדשה
לדוגמא :
RENAME emps TO employees_table
ALTER TABLE שם_טבלה ADD [CONSTRAINT שם_אילוץ ] סוג אילוץ (עמודה)
לדוגמא :
ALTER TABLE emps ADD CONSTRAINT emp_mnid_ck CHECK(manager_id > 0)
כדי להוסיף את האילוץ NOT NULL נכתוב :
ALTER TABLE שם_טבלה MODIFY (שם_עמודה [CONSTRAINT שם_אילוץ ] NOT NULL (
לדוגמא :
ALTER TABLE employees_table MODIFY (manager_id CONSTRAINT emp_mnid_nn NOT NULL)
ALTER TABLE employees_table DROP CONSTRAINT שם_אילוץ | UNIQUE(שם_עמודה) | PRIMARY KEY [CASCADE]
מחיקת אילוץ ע"י ציון שמו :
ALTER TABLE employees_table DROP CONSTRAINT emps_emml_ck2
מחיקת אילוץ UNIQUE :
ALTER TABLE employees_table DROP UNIQUE(emp_mail)
מחיקת PRIMARY KEY כאשר אין אילוצים נוספים התלויים בו :
ALTER TABLE employees_table DROP PRIMARY KEY
מחיקת PRIMARY KEY כאשר ישנם אילוצים נוספים התלויים בו (כל האילוצים התלויים בו
ימחקו גם כן) :
ALTER TABLE departments DROP PRIMARY KEY CASCADE
ALTER TABLE שם_טבלה DISABLE CONSTRAINTשם_אילוץ [CASCADE]
לדוגמא :
ALTER TABLE employees_table DISABLE emp_sal_ck
פקודת ה CASCADE תנטרל את כל האילוצים התלויים באילוץ :
ALTER TABLE departments DISABLE DEPT_ID_PK CASCADE
ALTER TABLE שם_טבלה ENABLE CONSTRAINT שם_אילוץ
לדוגמא :
ALTER TABLE departments ENABLE DEPT_ID_PK
v במידה והפעלנו אילוץ אשר נוטרל לפני כן ע"י פקודת CASCADE אנו נצטרך להפעיל מחדש את כל האילוצים התלויים בו (אין ENABLE CASCADE).
v כאשר נפעיל מחדש אילוץ על עמודה מסויימת, הערכים בתוך העמודה חייבים לתאום לאילוץ.
DROP TABLE שם_טבלה
לדוגמא :
DROP TABLE employees_table
פקודת TRUNCATE – מחיקת שורות מהטבלה
בדומה לפקודת DELETE (DML), פקודת TRUNCATE מוחקת גם היא שורות מן הטבלה.
TRUNCATE TABLE שם_טבלה
לדוגמא :
TRUNCATE TABLE employees_table
הבדלים בין פקודת TRUNCATE לפקודת DELETE :
DELETE |
TRUNCATE |
פקודת DML, חלק מטרנסאקציה, יש צורך בפקודת COMMIT כדי שהשינוי יעשה קבוע |
פקודת DDL ועל כן יתבצע COMMIT אוטומטי לאחר הרצתה |
אפשר להגדיר אילו שורות ימחקו |
כל השורות בטבלה ימחקו |
נחשבת פעולה איטית יותר |
נחשבת פעולה מהירה יותר |