MySQL必知必會筆記(五)插入數據 創建和操縱表


第二十章 插入數據

 

INSERT是用來插入(或添加)行到數據庫表的。插入數據的幾種方式:

1  插入完整的行

插入行的一部分

3  插入多行

插入某些查詢結果

INSERT SELECT語句

INSERT INTO customers(cust_id,cust_name,cust_email) 

SELECT cust_id,cust_name,cust_email FROM custnew;

列省略

    如果表中定義允許,則可以在INSERT操作中省略某些列,省略的列必須滿足以下某個條件。

該列定義為允許為NULL

在表定義中給出默認值,

 

提高整體性能

    數據庫經常多個客戶訪問,對處理什么請求以及用什么次序處理進行管理mysql的任務。INSERT操作可能很耗時(特別是由很多索引需要更新時),而且它可能降低等待處理的SELECT語句性能。

    如果數據檢索是最重要的(通常是這樣的),則你可以通過在INSERT INTO之間添加關鍵字 LOW_PRIORITY 指示mysql降低INSERT語句的優先集

 

更新和刪除數據

 

    為了更新(修該)表中的數據,可使用UPDATE語句,可采用兩種方式使用UPDATE

更新表中特定的行

更新表中所有的行

更新行和刪除行的時候一定要加上WHERE子句,否則后果自負

UPDATE bname SET zda = 'acontent' , zdb = 'bcontent' WHERE zdid='20005';

    IGNORE 關鍵字    如果使用UPDATE更新多行,並且在更新這些行中的一行或多行時出現一個錯誤,則整個UPDATE操作被取消,(錯誤發生前更新的所有行被恢復到他們原來的值)為即使發生錯誤也繼續進行更新。可使用IGNORE關鍵字

UPDATE  IGNORE bname;

 

刪除數據

為了從表中刪除(去掉)數據,使用DELETE語句,可以使用兩種方式:

        1 從表中刪除特定的行

從表中刪除所有的行

    不要省略WHERE子句

 

    更快的刪除  如果想從表中刪除所有的行,不要使用DELETE,可以使用TRUNCATE TABLE語句,他完成相同的工作,但速度更快(TRUNCATE實際上是刪除原來的表並重新創建一個表,而不是逐行去刪除表中的數據)

 

更新和刪除的指導原則

下面是許多sql程序員使用的UPDATEDELETE是所遵循的習慣

        1 除非確實打算更新和刪除每一行,否則絕對不要使用不帶WHERE子句的UPDATEDELETE語句。

        2 保證每個表都有主鍵,盡可能的像WHERE子句那樣使用它(可以指定各主鍵、多個值、和值的范圍)

        3 在對UPDATEDELETE語句操作使用WHERE前,應該先用SELECT進行測試,保證它過濾的數據是正確的記錄,以防編寫的WHERE子句不正確。

        4 使用強制實施引用完整的數據庫,這樣MYSQL將不允許刪除具有與其他表相關聯的數據的行

 

 

第二十一章  創建和操縱表

創建表

一般兩種創建表的方法

使用具有交互式創建和管理表的工具

表也可以直接用MySQL語句操縱

在使用交互式工具時,工具也是生成MySQL語句操縱數據庫

表創建基礎

為了利用CREATE TABLE創建表,必須給出下列信息:

新表的名字,在關鍵字CREATE TABLE之后給出

表列的名字和定義,用逗號分隔

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補足不足的位數,聲明一個int3ZEROFILL插入返回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()函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM