mysql 字段值为 a b c_数据的虚拟列-让数据库中的C字段等于a+b
直接用update aaaaa aa set aa.f = (aa.a+aa.b)就行了
=======================================
引出來的新知識--虛擬列
虛擬列的好處是:如果c=a+b那插入數據時;值只插入a=1,b=2;那么c會自動是3
oracle?temporary?table?and?virtual?column
(2013-07-31 15:06:55)
表是數據庫中保存用戶數據最基本的結構。下面我簡要的學習了臨時表和虛擬列。
表按照永久性可以分臨時表和永久表。
臨時表使用create global temporary table關鍵字來創建,創建的臨時表僅對當前的session可見,其他session是不可見的;臨時表在創建時,有關表的數據是保存在數據字典中(臨時表空間也永久存在的,但是里面的數據卻是沒有的,退出session后僅僅知識做truncate table的操作,所以臨時表空間在不用的時候是要手動drop的),但是沒有空間分配給臨時表,直到有數據插入時才分配。對臨時表的操作和對永久表(普通表)的dm和ddll操作是一樣的,她們兩者之間僅是生存周期不同。臨時表分session臨時表和事務臨時表,session臨時表在創建時會指定on commit preserve rows,session臨時表在該session結束時會自動刪除,僅該session可見。事務臨時表在創建時必須指定on commit delete rows(如果沒有指定則模式是事務臨時表),事務臨時表僅在創建的事務中存活,該事務結束則也會消失。
創建臨時表的一些限制:
1)不能分區,不能聚簇,不能索引組織
2)不能在臨時表中有外鍵約束
3)臨時表不能包含嵌套表中的列
4)臨時表不支持LOB_storage_clause: TABLESPACE, storage_clause, or logging_clause.
5)不支持并行的update,delete,merge
6)在創建臨時表時唯一可以指定的段屬性是表空間,且表空間只能是臨時表空間,如果在其他表空間會報0ra-02195嘗試創建的臨時對象在會臨時表空間中
7)分布式事務不支持臨時表
如果使用as 子查詢語句來創建表則可以不指定數據類型,設置外鍵的column也可以不指定數據類型
虛擬列:虛擬列是不保存在磁盤中的,僅在獲取的時候根據存儲在磁盤中的列計算,組合獲取。虛擬列可以創建索引,可以收集統計信息。創建虛擬列的語法是:column datatype(generated always) as (exp) virtrual,在定義虛擬列時沒有指定數據類型則默認使用虛擬列表達式里面返回的值的數據類型,虛擬列的值不能是哦那個update和insert操作來更新,其值會根據新加入或更新的對應的列值計算來獲取。針對虛擬列創建的索引等價于創建一個函數索引
虛擬列的限制:
1)虛擬列只能在relation heap表中使用,在組織索引表,外部表,對象表(objct table),聚簇報,臨時表中都不可用。
2)虛擬列的表達式不能指向另一個虛擬列(虛擬列是在查詢時根據表達式來計算,所以會有存在計算的是按后),這樣會存在不確定性;虛擬列表達式涉及到的列 只能在同一個表中;虛擬列表達式中可以使用用戶自定義的函數,但是如果使用用戶自定義的函數后,該虛擬列不能作為分區;虛擬列表達式返回的值必須是是一個 確定的值;
3)虛擬列的數據類型不能是 a user-defined type, or LOB or LONG RAW.
虛擬列相關測試腳本以及結果:
SQL> create or replace function test1
2? as
3? begin
4? return 23;
5? end;
6? /
函數已創建。
SQL> create table testvirtual (age number,
2? v_test generated always as
(age+10),
3? v_test1 generated always as
test1);
v_test1 generated always as test1)
*
第 3 行出現錯誤:
ORA-02000: 缺失 ( 關鍵字
SQL> insert into testvirtual values(10,20);
insert into testvirtual values(10,20)
*
第 1 行出現錯誤:
ORA-54013: 不允許對虛擬列執行 INSERT 操作
SQL> insert into testvirtual values(10);
insert into testvirtual values(10)
*
第 1 行出現錯誤:
ORA-00947: 沒有足夠的值
SQL> insert into testvirtual (age) values(10);
已創建 1 行。
SQL> select * from testvirtual;
AGE
V_TEST
---------- ----------
10
20
SQL> alter table testvirtual add (v_test1 as
(v_test+1) virtual);
alter table testvirtual add (v_test1 as (v_test+1) virtual)
*
第 1 行出現錯誤:
ORA-54012: 在列表達式中引用了虛擬列
SQL> alter table testvirtual add (v_test1 as (age+1)
virtual);
表已更改。
SQL> create or replace function testxu (p_in
number) return number deterministic
as
2? begin
3? return p_in+20;
4? end;
5? /
函數已創建。
SQL> create table testpartition (age number,
2? v_age as (testxu(age))
virtual)
3? partition by
range(v_age)(
4? partition p1 values less
than (30),
5? partition p2 values less
than (100),
6? partition p3 values less
than (200),
7? partition
pn? values less than (MAXVALUE)
8? );
v_age as (testxu(age)) virtual)
*
第 2 行出現錯誤:
ORA-54021: 不能在分區列或子分區列中使用 PL/SQL 表達式
SQL> create table testpartition (age
number,
2? v_age as (age+10)
virtual)
3? partition by
range(v_age)(
4? partition p1 values less
than (30),
5? partition p2 values less
than (100),
6? partition p3 values less
than (200),
7? partition
pn? values less than (MAXVALUE)
8? );
表已創建。
網絡文獻參考:
總結
以上是生活随笔為你收集整理的mysql 字段值为 a b c_数据的虚拟列-让数据库中的C字段等于a+b的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 创建端口号_MySQL命令行
- 下一篇: mysql怎么实现事务序列化_一文快速搞