1. 程式人生 > 資料庫 >SQL點滴系列之插入資料(四)

SQL點滴系列之插入資料(四)

【SQL從一點一滴分析系列文章】為實際開發中的點點滴滴的總結,從最最簡單的SQL 查詢 到 綜合分析查詢
在分析 SQL 時,也會同時分析 mybatis 、Hibernate 中的相關操作
點選檢視詳情

本節講述 在資料庫中插入資料

1 插入新的記錄

向表中插入一條新的記錄。
例如 向用戶表中新增一條新的資料,可以這樣寫

insert into t_user (user_id,user_name,user_age,user_address,user_phone)
values(32,'小不點',18,"龍城大街一號院",192303023994)

在 MySQL 和DB2 中,可以選擇一次插入一行,或者一次插入多行

insert into t_user (user_id,user_phone)
values
(32,192303023994),
(33,'小李子',20,"龍城大街二號院",192303023995)

insert 語句允許在資料庫表中建立新行,在所有型別的資料庫系統中,插入語句的語法完全相同,當然還有簡便的寫法就是

insert into t_user 
values('山西省',32,192303023994,)

需要注意的是如果沒有列出插入行中的目標欄位,則必須插入表中的所有的列。

2 插入預設值

定義表時,可以為某些列定義預設值,現在要以預設值插入一行,而無需指定各列的值。

2.1 建立表時指定列的預設值
creat table t_user (user_id default 0)

所有的資料庫系統都支援使用 default 關鍵字顯式的指定某列插入值,有些資料庫還支援其他的方法來解決這個問題

2.2 插入資料時使用預設值
insert into t_user (user_id,default,default)

當不需要將表中所有列都插入值時,可以明確的指定要使用預設值的列名稱,如上述寫 到的 user_address,user_phone 使用的 default

Oracle8i 資料庫及其以前版本不支援 default 關鍵字,在 Oracle9 c以前的資料庫中 無法顯示地插入預設值

在 MySQL 中,如果表中所有的列都定義了預設值,可以用一個空的值來解決問題

insert into t_user values()

在這種情況下,所有的列將設定為其預設值

在 PostgreSQL 和 SQL Service 中支援 default values 子句

insert into t_user default values 

default values 子句將所有的列設定為其本身的預設值。

在值列表中的 default 關鍵字為相應列插入預設值,預設值在建立表時定義,所有的資料庫中都可以使用些關鍵字。

3 使用 NULL 代替預設值

在一個定義了預設值的列插入資料,並且需要不管該列的預設值是什麼,可以將這個值設定為 NULL

create table t_user (user_id defalut 0,user_flag varchar(100))

現在插入一條資料

insert into t_user (user_id,user_flag) values (null,"今天心與心的交流了一下")

在上述插入的語句中,明確指定了 null,但是在實際開發中,並不是所有的人都知道可以在 insert 語句中明確指定 null 值,所有常用的做法是在插入資料時,不需要插入某列資料時,就不指定某列,如上述的插入 null 可以修改為

insert into t_user (user_flag) values ("今天心與心的交流了一下")

4 從一個表向另外一個表中複製行

將一個表中的資料複製到另一個表中,第一步 先查詢第一個表中的資料,第二步 複製,在這個過程中 查詢資料可能複雜也可能簡單,但是最終的結果就是複製
例如 將表 t_user 中的資料複製到表 t_dep_user 表中

insert into t_dep_user (dep_user_name,dep_user_flag)
select user_name,user_flag from t_user 

在這裡使用的方法就是在 insert 語句後面緊跟一個查詢,該查詢用來返回想要得到的行。

5 從一個表向另外多個表中複製行

與上述不同的是,從一個表中查詢出資料,然後將這些資料複製到多具表中,例如將表 t_user 中的資料複製到 t_user_2 、t_user_3 、t_user_4 中:

在 MySQL 、PostgreSQL 和 SQL Server 中還不支援這種多表插入操作

在 Oracle 中可以這樣寫

insert all 
    when user_age < 18 then 
        into t_user_2(user_name,user_flag) values (dep_user_name,dep_user_age,dep_user_flag)
    when user_age >60 then 
        into t_user_3(user_name,dep_user_flag)
    else 
        into t_user_4(user_name,dep_user_flag)
    select dep_user_name,dep_user_flag from t_user 

在 DB2 中可以將所有的目標用 union all 聯接


///先建立表
create table t_user_2(user_name varchar(10),user_age integer check (user_age <18),user_flag varchar(44))
create table t_user_3(user_name varchar(10),user_age integer check (user_age >=18 and user_age <=60),user_flag varchar(44))
create table t_user_4(user_name varchar(10),user_age integer check (user_age >60),user_flag varchar(44))

///插入資料 

insert into (
 select * from t_user_2 union all
 select * from t_user_3 union all
 select * from t_user_4 
) select * from t_user 

6 複製表結構

在實際中,想要建立新表,該表與已有的表的結構設定相同,就可以考慮只複製表結構
在 DB2 中,使用帶有 like 子句的 create table 命令

create table t_user_2 like t_user

在 Oracle 、MySQL 和 PostgreSQL 中,使用一個不返回任何行的子查詢

create table t_user_2 as select * from t_user where 1=0

在這裡 where 1=0 導致了查詢不返回任何行,這樣最終建立的表就是根據查詢中select 子句中的列名產生的空表


完畢