Apache Derby - Tuyên bố bảng thay đổi
Câu lệnh ALTER TABLE, cho phép bạn thay đổi bảng hiện có. Sử dụng điều này, bạn có thể làm như sau:
Thêm một cột, thêm một ràng buộc
Thả một cột, bỏ một ràng buộc
Thay đổi khóa cấp độ hàng của bảng
Giả sử chúng ta đã tạo một bảng có tên Nhân viên như hình dưới đây -
ij> CREATE TABLE Employees (
Id INT NOT NULL GENERATED ALWAYS AS IDENTITY,
Name VARCHAR(255),
Salary INT NOT NULL,
Location VARCHAR(255),
PRIMARY KEY (Id)
);
Và, đã chèn bốn bản ghi bằng cách sử dụng câu lệnh chèn dưới dạng:
ij> INSERT INTO Employees (Name, Salary, Location) VALUES
('Amit', 30000, 'Hyderabad'),
('Kalyan', 40000, 'Vishakhapatnam'),
('Renuka', 50000, 'Delhi'),
('Archana', 15000, 'Mumbai');
Thêm cột vào bảng
Sau đây là cú pháp để thêm một cột vào bảng bằng cách sử dụng câu lệnh ALTER.
ALTER TABLE table_name ADD COLUMN column_name column_type;
Thí dụ
Sử dụng câu lệnh ALTER, chúng tôi đang cố gắng thêm một cột mới có tên Age với kiểu số nguyên.
ALTER TABLE Employees ADD COLUMN Age INT;
0 rows inserted/updated/deleted
Thêm một cột khác có tên Phone_No với kiểu số nguyên.
ALTER TABLE Employees ADD COLUMN Phone_No BIGINT;
0 rows inserted/updated/deleted
Lệnh DESCRIBE mô tả bảng cụ thể bằng cách liệt kê các cột và chi tiết của chúng, nếu bảng tồn tại. Nếu bạn MÔ TẢ, bảng Nhân viên bạn có thể quan sát các cột mới được thêm vào như hình bên dưới:
ij> DESCRIBE Employees;
COLUMN_NAME |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
ID |INTEGER |0 |10 |10 |AUTOINCRE&|NULL |NO
NAME |VARCHAR |NULL|NULL|255 |NULL |510 |YES
SALARY |INTEGER |0 |10 |10 |NULL |NULL |NO
LOCATION |VARCHAR |NULL|NULL|255 |NULL |510 |YES
AGE |INTEGER |0 |10 |10 |NULL |NULL |YES
PHONE_NO |INTEGER |0 |10 |10 |NULL |NULL |YES
6 rows selected
Thêm một ràng buộc vào bảng
Sau đây là cú pháp để thêm một ràng buộc vào một cột của bảng bằng cách sử dụng câu lệnh ALTER.
ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint (column_name);
Ở đâu constraint có thể KHÔNG ĐẦY ĐỦ, KHÔNG ĐỦ, KHÓA CHÍNH, CHÌA KHÓA ĐỘC ĐÁO, KHÓA NGOẠI TỆ, KIỂM TRA.
Thí dụ
Sử dụng câu lệnh ALTER, chúng tôi đang cố gắng thêm ràng buộc UNIQUE vào cột Phone_No.
ij> ALTER TABLE Employees ADD CONSTRAINT New_Constraint UNIQUE(Phone_No);
0 rows inserted/updated/deleted
Khi bạn thêm ràng buộc DUY NHẤT vào một cột, nó không thể có cùng giá trị cho hai hàng, tức là số điện thoại phải là duy nhất cho mỗi nhân viên.
Nếu bạn cố gắng thêm hai cột có cùng một số điện thoại, bạn sẽ nhận được một ngoại lệ như hình dưới đây.
ij> INSERT INTO Employees (Name, Salary, Location, Age, Phone_No) VALUES
('Amit', 30000, 'Hyderabad', 30, 9848022338);
1 row inserted/updated/deleted
ij> INSERT INTO Employees (Name, Salary, Location, Age, Phone_No) VALUES
('Sumit', 35000, 'Chennai', 25, 9848022338);
ERROR 23505: The statement was aborted because it would have caused a duplicate
key value in a unique or primary key constraint or unique index identified by
'NEW_CONSTRAINT' defined on 'EMPLOYEES'.
Bỏ ràng buộc khỏi bảng
Sau đây là cú pháp để bỏ một ràng buộc của một cột:
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
Thí dụ
Truy vấn sau đây xóa tên ràng buộc New_Constraint trên cột Phone_No được tạo ở trên.
ij> ALTER TABLE Employees DROP CONSTRAINT New_Constraint;
0 rows inserted/updated/deleted
Vì chúng tôi đã loại bỏ ràng buộc DUY NHẤT trên cột Phone_No, bạn có thể thêm các cột có cùng số điện thoại.
ij> INSERT INTO Employees (Name, Salary, Location, Age, Phone_No) VALUES
('Sumit', 35000, 'Chennai', 25, 9848022338);
1 row inserted/updated/deleted
Bạn có thể xác minh nội dung của bảng ij> chọn * từ Nhân viên như sau:
ID |NAME |SALARY |LOCATION |AGE |PHONE_NO
-------------------------------------------------------------------------
1 |Amit |30000 |Hyderabad |30 |9848022338
2 |Sumit |35000 |Chennai |25 |9848022338
2 rows selected
Bỏ cột khỏi bảng
Sau đây là cú pháp để thả một cột của một cột.
ALTER TABLE table_name DROP COLUMN column_name;
Thí dụ
Truy vấn sau sẽ xóa cột có tên age of the employee -
ij> ALTER TABLE Employees DROP COLUMN Age;
0 rows inserted/updated/deleted
Nếu bạn mô tả bảng, bạn chỉ có thể thấy 4 cột.
ij> DESCRIBE Employees;
COLUMN_NAME |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
ID |INTEGER |0 |10 |10 |AUTOINCRE&|NULL |NO
NAME |VARCHAR |NULL|NULL|255 |NULL |510 |YES
SALARY |INTEGER |0 |10 |10 |NULL |NULL |NO
LOCATION |VARCHAR |NULL|NULL|255 |NULL |510 |YES
PHONE_NO |BIGINT |0 |10 |19 |NULL |NULL |YES
Bảng thay đổi bằng chương trình JDBC
Sau đây là chương trình JDBC để thay đổi bảng bằng cách sử dụng truy vấn ALTER:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class AlterTableExample {
public static void main(String args[]) throws Exception {
//Registering the driver
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
//Getting the Connection object
String URL = "jdbc:derby:sampleDB;create=true";
Connection conn = DriverManager.getConnection(URL);
//Creating the Statement object
Statement stmt = conn.createStatement();
//Executing the query
String createQuery = "CREATE TABLE Employees( "
+ "Id INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
+ "Name VARCHAR(255), "
+ "Salary INT NOT NULL, "
+ "Location VARCHAR(255), "
+ "PRIMARY KEY (Id))";
stmt.execute(createQuery);
System.out.println("Table created");
System.out.println(" ");
//Executing the query
String insertQuery = "INSERT INTO Employees("
+ "Name, Salary, Location) VALUES "
+ "('Amit', 30000, 'Hyderabad'), "
+ "('Kalyan', 40000, 'Vishakhapatnam'), "
+ "('Renuka', 50000, 'Delhi'), "
+ "('Archana', 15000, 'Mumbai'), "
+ "('Trupti', 45000, 'Kochin')";
stmt.execute(insertQuery);
System.out.println("Values inserted");
System.out.println(" ");
//Executing the query
String selectQuery = "SELECT * FROM Employees";
ResultSet rs = stmt.executeQuery(selectQuery);
System.out.println("Contents of the table after inserting the table");
while(rs.next()) {
System.out.println("Id: "+rs.getString("Id"));
System.out.println("Name: "+rs.getString("Name"));
System.out.println("Salary: "+rs.getString("Salary"));
System.out.println("Location: "+rs.getString("Location"));
}
System.out.println(" ");
//Altering the table
stmt.execute("ALTER TABLE Employees ADD COLUMN Age INT");
stmt.execute("ALTER TABLE Employees ADD COLUMN Phone_No BigINT");
stmt.execute("ALTER TABLE Employees " + "ADD CONSTRAINT New_Constraint UNIQUE(Phone_No)");
stmt.execute("INSERT INTO Employees "
+ "(Name, Salary, Location, Age, Phone_No) "
+ "VALUES ('Amit', 30000, 'Hyderabad', 30, 9848022338)");
ResultSet alterResult = stmt.executeQuery("Select * from Employees");
System.out.println("Contents of the table after altering "
+ "the table and inserting values to it: ");
while(alterResult.next()) {
System.out.println("Id: "+alterResult.getString("Id"));
System.out.println("Name: "+alterResult.getString("Name"));
System.out.println("Salary: "+alterResult.getString("Salary"));
System.out.println("Location: "+alterResult.getString("Location"));
System.out.println("Age: "+alterResult.getString("Age"));
System.out.println("Phone_No: "+alterResult.getString("Phone_No"));
}
}
}
Đầu ra
Khi thực hiện chương trình trên, kết quả sau sẽ được tạo:
Table created
Values inserted
Contents of the table after inserting the table
Id: 1
Name: Amit
Salary: 30000
Location: Hyderabad
Id: 2
Name: Kalyan
Salary: 40000
Location: Vishakhapatnam
Id: 3
Name: Renuka
Salary: 50000
Location: Delhi
Id: 4
Name: Archana
Salary: 15000
Location: Mumbai
Id: 5
Name: Trupti
Salary: 45000
Location: Kochin
Contents of the table after altering the table and inserting values to it:
Id: 1
Name: Amit
Salary: 30000
Location: Hyderabad
Age: null
Phone_No: null
Id: 2
Name: Kalyan
Salary: 40000
Location: Vishakhapatnam
Age: null
Phone_No: null
Id: 3
Name: Renuka
Salary: 50000
Location: Delhi
Age: null
Phone_No: null
Id: 4
Name: Archana
Salary: 15000
Location: Mumbai
Age: null
Phone_No: null
Id: 5
Name: Trupti
Salary: 45000
Location: Kochin
Age: null
Phone_No: null
Id: 6
Name: Amit
Salary: 30000
Location: Hyderabad
Age: 30
Phone_No: 9848022338