1. 程式人生 > >資料庫基礎03——資料表操作

資料庫基礎03——資料表操作

資料庫基礎03——資料表操作

1、建表之前需要思考的基本問題

  • 表裡會包含什麼型別的資料?
  • 表的名稱是什麼?
  • 哪個(或哪些) 列組成主鍵?
  • 列(欄位) 的名稱是什麼?
  • 每一列的資料型別是什麼?
  • 每一列的長度是多少?
  • 表裡哪些列可以是NULL?
  • 遵循每個DBMS的命名規則

2、建表語句CREATE TABLE

create table 表名(

​ 欄位名 型別(長度) [約束],

​ 欄位名 型別(長度)[約束]

);

例如下面的建表語句:

CREATE
TABLE Products ( prod_id CHAR(10) NOT NULL, vend_id CHAR(10) NOT NULL, prod_name CHAR(254) NOT NULL, prod_price DECIMAL(8,2) NOT NULL, prod_desc VARCHAR(1000) NULL );

注意:不同的DBMS 的建表語句是有差異的,上面的sql在Oracle、PostgreSQL、SQL Server 和 SQLite
中有效,而對於 MySQL, varchar 必須替換為 text; 因為MySQL中,VARCHAR表示長度可變,最多不超過255位元組。所以這裡的1000就需要用到大文字的text。

**命名規範:表和列的名稱, 應該讓名稱反應出所儲存的資料 **

3、建立自增長的列

MySQL 提供了 SERIAL 方法為表生成真正的唯一值 :

CREATE TABLE TEST_INCREMENT(
	ID			SERIAL,	--這裡不宣告就是預設為null,如果not null必須明確指定
    TEST_NAME	VARCHAR(20));

Microsoft SQL Server中可以使用 IDENTITY型別:

CREATE TABLE TEST_INCREMENT(
	ID		INT  IDENTITY(1,1) NOT NULL,
    TEST_NAME	VARCHAR
(20);

Oracle 沒有提供直接的方法來建立自動增加的列。 但卻可以使用 SEQUENCE 物件和一個觸發器來實現類似的效果。

4、ALTER TABLE命令 (修改表)

表建立以後,我們可以使用alter table命令新增列、 刪除列、 修改列定義、 新增和去除約束, 在某些實現中還可以修改表STORAGE值。

首先說明下mysql的 alter 語句;

alter table 表名   add 列名  型別(長度) [約束]--修改表新增列
alter table 表名	 modify 列名 型別(長度) [約束]--修改表修改列的型別長度及約束
alter table 表名	change 舊列名	新列名	型別(長度) 約束;  --修改表修改列名
alter table 表名	drop  列名;						--修改表刪除列
rename table 表名  to  新表名;						--修改表名
alter  table 表名	character set 字符集;				--修改表的字符集

(1)修改資料型別

要改變表中列的資料型別,請使用下面的語法:

**SQL Server / MS Access:**修改表修改列的型別長度及約束

ALTER TABLE 表名
ALTER COLUMN 列名 型別

**My SQL / Oracle:**修改表修改列的型別長度及約束

ALTER TABLE 表名
MODIFY COLUMN 列名 型別

Oracle 10G 之後版本:修改表修改列的型別長度及約束

ALTER TABLE 表名 MODIFY 列名 型別;
alter table tableName modify (cloumnName 資料型別); -- 修改資料型別

(2)新增列、刪除列

如果表已經包含資料, 這時新增的列就不能定義為NOT NULL , 強行向表新增一列的方法如下:
1. 新增一列, 把它定義為NULL(這一行不一定要包含資料) ;
2. 給這個新列在每條記錄裡都插入資料;
3. 把列的定義修改為NOT NULL。

如需在表中新增列,請使用下面的語法:

ALTER TABLE 表名   ADD 列名 型別

如需刪除表中的列,請使用下面的語法(請注意,某些資料庫系統不允許這種在資料庫表中刪除列的方式):

ALTER TABLE 表名  DROP COLUMN 列名
--至少mysql  sqlserver  oracle是允許的

SQL server 中修改欄位名

execute sp_rename '表名.舊欄位名','新欄位名'

MySQL修改欄位名:

alter table 表名	change 舊列名	新列名	型別(長度) 約束;  --修改表修改列名

Oracle修改欄位名:

alter table tableName rename column oldCName to newCName; -- 修改欄位名

5、從現有表新建另一個表

語法如下:

create table  新表名 as       
select [*|column1,column2...]	--可以是部分欄位也可以是所有欄位
from  表名
[where]							--可以新增條件

MySQL和Oracle都支援使用CREATE TABLE AS SELECT方法, 在一個表的基礎上建立另一個表。 但是
Microsoft SQL Server卻不一樣, 它使用SELECT…INTO方法來實現相同的效果。

SQLserver如下:

select [*|column1,column2]
into  新表名
form 舊錶名
[where]

6、刪除表

如果使用了RESTRICT選項, 並且表被檢視或約束所引用, DROP語句就會返回一個錯誤。

當使用了CASCADE選項時, 刪除操作會成功執行, 而且全部引用檢視和約束都被刪除。

drop table table_name [restrict|cascade]

在SQL Server中, 不能使用CASCADE選項。 因此, 要在SQL Server中刪除表, 必須同時刪除與該表有
引用關係的所有物件, 以避免系統中遺留無效物件。

7、完整性約束

  • 主鍵約束
  • 唯一性約束
  • 外來鍵約束
  • NOT NULL 約束
  • 檢查約束

(1)主鍵約束:主鍵是表裡一個或多個用於實現記錄唯一性的欄位。(可以一個,也可以多個)

​ 要求被修飾的欄位 唯一、非空

CREATE TABLE EMPLOYEE_TBL(
	EMP_ID		CHAR(9)   NOT NULL PRIMARY KEY,-- 這裡的主鍵是個隱含約束
	EMP_NAME	VARCHAR(40) NOT NULL
);
--還可以明確指定主鍵
CREATE TABLE EMPLOYEE_TBL(
	EMP_ID		CHAR(9)   NOT NULL,
	EMP_NAME	VARCHAR(40) NOT NULLPRIMARY KEY(EMP_ID)
);
/*如果多個欄位也可以用以下兩種方式之一來定義*/--以下在oracle資料庫是可行的
CREATE TABLE PRODUCT_TST(
	PROD_ID		VARCHAR2(10) NOT NULL,
    VEND_ID		VARCHAR2(30) NOT NULL,
    PRODUCT		VARCHAR2(10) NOT NULL,
    PRIMARY KEY(PROD_ID,VEND_ID)
)--或者
ALTER TABLE PRODUCTS_TST
ADD CONSTRAINT	PRODUCTS_PK PRIMARY KEY (prod_id,VEND_ID)

(2)唯一性約束

唯一性約束要求表裡某個欄位的值在每條記錄裡都是唯一的 。主鍵必須唯一,唯一不一定是主鍵。

CREATE TABLE EMPLOYEE_TBL(
	EMP_ID		CHAR(9)   NOT NULL PRIMARY KEY,
	EMP_NAME	VARCHAR(40) NOT NULL  UNIQUE-- 舉個例子,直接加 UNIQUE字句就行
);

(3)外來鍵約束

外來鍵是子表裡的一個欄位, 引用父表裡的主鍵。 外來鍵約束是確保表與表之間引用完整性的主要機制。
一個被定義為外來鍵的欄位用於引用另一個表裡的主鍵。 舉個例子:

CRATE TABLE EMPLOYEE_PAY_TST(
	EMP_ID		CHAR(9)		NOT NULL,
    POSITION	VARCHAR(15)	NOT NULL,
    DATE_HIRE	DATE		NULL,
    PAY_RATE	NUMBER(4,2)	NOT NUL,
    CONSTRAINT	EMP_ID_FK	FOREIGN KEY(EMP_ID) REFREENCES EMPLOYEE_TBL(EMP_ID)
    --這裡 是把此表的 EMP_ID作為EMPLOYEE_TBL作為的外來鍵,於EMPLOYEE_TBL 的EMP_ID一一對應
);

注意:子表裡的EMP_ID欄位引用父表裡的EMP_ID欄位。 為了在子表裡插入一個EMP_ID的值, 它首先要存在於父表的EMP_ID裡。 類似地, 父表裡刪除一個EMP_ID的值, 子表裡相應的EMP_ID值必須全部被刪除。 這就是引用完整性的概念

還可以利用ALTER TABLE 命令向表裡新增外來鍵

alter table employee_pay_tbl add constraint id_fk foreign key(emp_id)
references employee_tbl(emp_id)
--語法
alter table 從表名  add  constraint 外來鍵名(自己起) foreign key(外來鍵)
references 主表名(主鍵)

(4)NOT NULL 約束:例子中已經展示,not null就行

(5)檢查約束

檢查(CHK) 約束用於檢查輸入到特定欄位的資料的有效性, 可以提供後端的資料庫編輯。 檢查約束為資料提供了另一層保護。

CRATE TABLE EMPLOYEE_PAY_TST(
	EMP_ID		CHAR(9)		NOT NULL,
    POSITION	VARCHAR(15)	NOT NULL,
    DATE_HIRE	DATE		NULL,
    PAY_RATE	NUMBER(4,2)	NOT NUL,
    EMP_ZIP		NUMBER(5)	NOT NULL,
    CONSTRAINT CHK_EMP_ZIP	CHECK(EMP_ZIP='12345')
    --這個檢查約束就是保證輸入到這個表的資料的emp_zip都是‘12345’,只是個例子,知道這麼用就行
    --在檢查約束裡可以使用幾乎任何條件,就像在SQL查詢裡一樣。 check(條件)
);

(6)去除約束

利用ALTER TABLE命令的DROP CONSTRAINT選項可以去除已經定義的約束。

ALTER TABLE EMPLOYEES DROP CONSTRAINT EMPLOYEES_PK;--這裡就是去掉了empoyees表中的employees_pk的主鍵約束。

如果要刪除外來鍵約束:

ALTER TABLE 表名 DROP CONSTRAINT 外來鍵約束名;--所以新增約束的時候最好起起個約束名,不然不好刪