第二十章 插入數據
INSERT是用來插入(或添加)行到數據庫表的。插入數據的幾種方式:
1 插入完整的行
2 插入行的一部分
3 插入多行
4 插入某些查詢結果
INSERT SELECT語句
INSERT INTO customers(cust_id,cust_name,cust_email)
SELECT cust_id,cust_name,cust_email FROM custnew;
列省略
如果表中定義允許,則可以在INSERT操作中省略某些列,省略的列必須滿足以下某個條件。
1 該列定義為允許為NULL
2 在表定義中給出默認值,
提高整體性能
數據庫經常多個客戶訪問,對處理什么請求以及用什么次序處理進行管理mysql的任務。INSERT操作可能很耗時(特別是由很多索引需要更新時),而且它可能降低等待處理的SELECT語句性能。
如果數據檢索是最重要的(通常是這樣的),則你可以通過在INSERT 和INTO之間添加關鍵字 LOW_PRIORITY 指示mysql降低INSERT語句的優先集
更新和刪除數據
為了更新(修該)表中的數據,可使用UPDATE語句,可采用兩種方式使用UPDATE
1 更新表中特定的行
2 更新表中所有的行
更新行和刪除行的時候一定要加上WHERE子句,否則后果自負
UPDATE bname SET zda = 'acontent' , zdb = 'bcontent' WHERE zdid='20005';
IGNORE 關鍵字 如果使用UPDATE更新多行,並且在更新這些行中的一行或多行時出現一個錯誤,則整個UPDATE操作被取消,(錯誤發生前更新的所有行被恢復到他們原來的值)為即使發生錯誤也繼續進行更新。可使用IGNORE關鍵字
UPDATE IGNORE bname;
刪除數據
為了從表中刪除(去掉)數據,使用DELETE語句,可以使用兩種方式:
1 從表中刪除特定的行
2 從表中刪除所有的行
不要省略WHERE子句
更快的刪除 如果想從表中刪除所有的行,不要使用DELETE,可以使用TRUNCATE TABLE語句,他完成相同的工作,但速度更快(TRUNCATE實際上是刪除原來的表並重新創建一個表,而不是逐行去刪除表中的數據)
更新和刪除的指導原則
下面是許多sql程序員使用的UPDATE或DELETE是所遵循的習慣
1 除非確實打算更新和刪除每一行,否則絕對不要使用不帶WHERE子句的UPDATE或DELETE語句。
2 保證每個表都有主鍵,盡可能的像WHERE子句那樣使用它(可以指定各主鍵、多個值、和值的范圍)
3 在對UPDATE和DELETE語句操作使用WHERE前,應該先用SELECT進行測試,保證它過濾的數據是正確的記錄,以防編寫的WHERE子句不正確。
4 使用強制實施引用完整的數據庫,這樣MYSQL將不允許刪除具有與其他表相關聯的數據的行
第二十一章 創建和操縱表
創建表
一般兩種創建表的方法
1 使用具有交互式創建和管理表的工具
2 表也可以直接用MySQL語句操縱
在使用交互式工具時,工具也是生成MySQL語句操縱數據庫
表創建基礎
為了利用CREATE TABLE創建表,必須給出下列信息:
1 新表的名字,在關鍵字CREATE TABLE之后給出
2 表列的名字和定義,用逗號分隔
CREATE TABLE table
(
column_id int NOT NULL AUTO_INCRMENT,
columnOne char(20) NOT NULL DEFAULT 1,
columnOne char(20) NOT NULL ,
column char(20) NOT NULL ,
.....
PRIMARY KEY ( column_id)
) ENGINE = InnoDB
如果表已經存在,則必須先刪除后在創建他,不可以直接覆蓋。如果僅想在表沒有存在的情況下創建它,應該在表名后給出 IF NOT EXISTS
使用NULL值 如果不指定列為NOT NULL則它默認是NULL
主鍵再介紹 主鍵的值必須是唯一的。創建主鍵時可以用單列做主鍵PRIMARY KEY(columnOne,columnTwo),也可以使用多列做主鍵PRIMARY KEY(columnOne,columnTwo).主鍵值不允許為NULL
索引創建
CREATE INDEX indexname ON tablename (column [ASC|DESC],....);
使用AUTO_INCREMENT
每個表只允許使用一個AUTO_INCREMENT列,而且它必須被索引,(如通過使它為主鍵)
如果兩個表關聯,添加時一表時需要另一表的主鍵,該怎么獲得呢:
可以使用last_insert_id()函數獲得這個值 此語句返回最后一個AUTO_CREMENT的值。
指定默認值
如果在插入行時沒有給出值,mysql允許指定此時使用默認值。默認值是在CREATE TABLE語句的列定義中的DEFAULT關鍵字定義的。
columnOne char(20) NOT NULL DEFAULT 1,
MySQL不允許使用函數作為默認值,它只支持常量
引擎搜索
你可能已經注意到,迄今為止使用的CREATE TABLE語句全都以ENGINE = InnoDB語句結束
與其他的DBMS一樣,MySQL有一個具體管理和處理數據的內部引擎,在你使用CREATE TABLE語句是,該引擎具體創建表,在其他應用中區修改讀取刪除表等處理你的請求,多數時候它隱藏在DBMS內,不需要過多的關注它。
但MySQL與其他的DBMS不一樣,它具有多種引擎,它打包多個引擎,這些引擎都隱藏在MySQL服務器內,全都能處理用戶的請求。
為什么要發行多種引擎呢,因為他們具有各自不同的功能和特性,為了不同的任務選擇正確的引擎能獲得良好的功能和靈活性
當然你也可以省略這些數據庫引擎,如果省略ENGINE=語句,則使用默認引擎(很可能為MyISAM),多數sql語句都會默認使用它,但並不是所有的語句都默認使用它,這就是為什么ENGINE=語句很重要的原因。
以下幾個需要知道的引擎
1 InnoDB是一個可靠的事務處理引擎,它不支持全文本搜索。
2 MEMORY 在功能上等同於MySAM,但由於數據存儲在內存,所以速度更快(特別適用於臨時表)
3 MySAM是一個性能極高的引擎,它支持全文本搜索,但不支持事務處理
引擎類型可以混用。混用引擎類型的一個大缺陷。外鍵不能跨引擎,即使用一個引擎的表不能引用具有使用不同引擎的表的外鍵
更新表
為了更新表,可以使用ALTER TABLE語句,但是在理想狀態下,當表中存儲了數據后就不應該再去更新表了。所以在設計表時需要花費大量的時間去考慮,以便后期不做太大的改動。
ALERT TABLE更改表結構,必須給出下面的信息:
1 在ALERT TABLE之后給出要修改的表名
2 所做更改的列表
添加一列 ALERT TABLE column ADD columnFour CHAR(90);必須指明數據類型
刪除一列 ALERT TABLE column DORP columnFour ;
定義外鍵
ALERT TABLE tableOne ADD CONSTRAINT columnOne
FOREIGN KEY (column_id) PEFERENCES tableTwo (column_id)
可以單條ALTER TABLE語句對單個表進行多個修改,每個修改用逗號分隔開。
復雜的表結構一般需要手動刪除過程
1 用新的列布局創建一個新表
2 使用INSERT SELECT 語句從舊表復制數據當道新表。如果有必要,可以使用轉換函數和計算字段
3 檢驗包含所需數據的新表
4 重名名舊表
5 用舊表原來的名字重命名新表
6 根據需要,重新創建觸發器、存儲過程、索引和外鍵
小心使用ALTER TABLE 因為它是不可逆的操作,最好操作前完成已備份。
刪除表
DORP TABLE table; 不可撤銷,永久刪除表
重命名表
RENAME TABLE table TO table2; 多個表重命名 逗號分隔開
CREATE DATABSE [IF NOT EXISTS] dataname;
DORP DATABSES [IF EXISTS] databses;
在整型數據列后加上 UNSIGNED 屬性可禁止負數,取值從0開始。范圍擴大一倍-125---125 0-250
ZEROFILL 數據字段屬性,在數值之前自動用0補足不足的位數,聲明一個int(3)ZEROFILL插入5 返回005
CREATE TABLE tablename(
Id int(5) UNSIGNED.......
Num ind(3) ZEROFILL....
Sex int(1) DEFAULT 0 ......
Name varchar(10) NOT NULL......
)
Mysql默認字符集設置:win my.ini linux /etc/my.cnf
Character-set-server = gbk;
Collation-server =gbk_chinese_ci;
創建數據庫時設置字符集語句:
CREATE DATABASE IF NOT mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
數據庫文件結構
一個MyISAM數據表會有三個文件,以.frm為后綴的結構定義文件,以.MYD為后綴名的數據文件,一個以.MYI為后綴名的索引文件
一個InnoDB數據表只有一個文件
CREATE TABLE t (i INT) ENGINE = INNODB;
CREATE TABLE t (i INT) TYPE = MYISAM;
Mysql_db_query(''sql........,$linke) 當文件連接兩個數據庫時指定在哪個數據庫上執行
當query函數出錯時可以用mysql_errno()【錯誤號】和mysql_error()函數來確定
當query函數執行后可以使用mysql_affected_rows()來查看他們到底修改了多少行
還可以mysql_insert_id()查看最后插入的自增字段(id)值
查詢結果集處理
$result = mysql_query(select * from books);
$rows= mysql_num_rows($result); 顯示結果的行數
$cols = mysql_num_fields($result); 顯示結果的列數
Mysql_fetch_row(); 將一條結果記錄返回並以一個普通索引數組的形式保存
Mysql_fetch_assoc(); 將一條結果記錄返回並以一個普通關聯數組的形式保存
Mysql_fetch_array(); 將一條結果記錄返回一個關聯數組或索引數組,或同同時獲得索引關聯數組,通過傳遞MYSQL_ASSOC 、MYSQL_NUM MYSQL_BOTH中的一個常量返回不同的數組形態。默認使用MYSQL_BOTH常量
Mysql_fetch_object(); 以一個對象的形式返回一條結果記錄,它的各個記錄需要以對象的方式進行訪問。
獲取列數信息(數據類型,長度,索引) mysql_fetch_fields()
php默認把結果集一直保存到php腳本執行結束為止,如果想提前釋放結果集,使用mysql_free_result()函數。
