資料庫動態欄位
⑴ 資料庫動態添加欄位
用sql語句添加刪除修改欄位、一些表與欄位的基本操作、資料庫備份等。
在資料庫表中,我們可以在表設計中添加欄位並設置數據類型也可以通過代碼,在程序中添加自動編號欄位。
部分選擇型欄位的選項,來自於資料庫這里得考慮如何更簡單的對接,和處理token或者cookie。
⑵ 怎樣動態地給資料庫增加或修改欄位名
在已有資料庫中的表添加欄位:
1、通用式:
alter table [表名] add [欄位名] 欄位屬性 default 預設值 default 是可選參數
2、增加欄位:
alter table [表名] add 欄位名 smallint default 0 增加數字欄位,整型,預設值為0
alter table [表名] add 欄位名 int default 0 增加數字欄位,長整型,預設值為0
alter table [表名] add 欄位名 single default 0 增加數字欄位,單精度型,預設值為0
alter table [表名] add 欄位名 double default 0 增加數字欄位,雙精度型,預設值為0
alter table [表名] add 欄位名 Tinyint default 0 增加數字欄位,位元組型,預設值為0
alter table [表名] add 欄位名 text [null] 增加備注型欄位,[null]可選參數
alter table [表名] add 欄位名 memo [null] 增加備注型欄位,[null]可選參數
alter table [表名] add 欄位名 varchar(N) [null] 增加變長文本型欄位 大小 為N(1~255)
alter table [表名] add 欄位名 char [null] 增加定長文本型欄位 大小固定為255
alter table [表名] add 欄位名 Datetime default 函數 增加日期型欄位,其中 函數 可以是 now(),date()等,表示預設值
3、(上面都是最常用的,還有其他的屬性,可以參考下面的數據類型描述)
4、刪除欄位:
alter table [表名] drop 欄位名
修改變長文本型欄位的大小:alter table [表名] alter 欄位名 varchar(N)
刪除表: drop table [表名]
⑶ django中怎麼動態操作資料庫欄位
django的ORM系統不支持修改刪除欄位的操作,也就是說你在寫模型model文件的時候,比如說定義了這個user表,然後包含欄位telphone定義,你一旦執行了manage.py syncdb 這個操作,就把表結構往資料庫寫死了,如果你之是刪除了model文件的telphone,資料庫是不被重新修改的。這個時候必須用原生SQL解決,也就是說自己寫SQL語句讓django執行,這樣的話會出很多問題,也就是說你執行了alter table users drop column telphone之後,你的model文件不知道你已經對users表結構做了修改,這樣會出直接導致django應用的崩潰。所以動態欄位不好做。也可能是我才疏學淺,沒太理解,也許有高人能做到。不過面對ORM這樣的盡量別刪除欄位。
⑷ 如何使用 動態欄位 查詢表數據
在做動態建表時,遇到了一個很棘手的問題:如何判斷一個表在資料庫中是否存在?開始,想到的是:先去執行創建表的SQL語句,如果此語句錯誤,則該表可能存在於資料庫當中(為什麼?)
後來,感覺此法大大不妥,上網查了半天,才知道這個問題可通過系統表圓滿的解決。
Access當中系統表中有一個叫Msysobjects的,Access2003中可能把幾個表都隱藏了,並且默認狀態下是不能對這幾個表進行操作的,如果需要操作這幾個表,需要對相關的許可權進行相應的設置:具體如下:
1、把系統表顯示出來:工具---------->選項 在顯示標簽中選中 「系統對象」
2、設置許可權: 工具----------〉安全-----------〉用戶與組的許可權 在「對象名稱」裡面選中MsysObjects,在「許可權"標 簽 當中設置許可權。
ACCESS2000文件格式
第一步:顯示系統表
菜單:【工具】>【選項】
選項卡:試圖
顯示:系統對象
第二步:設置系統表的操作許可權
菜單:【工具】>【安全】>【用戶與組許可權】
對象名稱:選擇需要設置許可權的系統表名稱(MSysObjects)
許可權:復選擇「查詢數據」,「更新數據」,「插入數據」,「刪除數據」
第三步:確定按鈕,OK!
⑸ 怎麼設計動態欄位的產品資料庫表
CREATE TABLE Sample(
name varchar(12),
field0 varchar(1),
field1 varchar(1),
fieldN varchar(1)
}
然後看實際運行時候的需要,動態分配欄位給系統使用,也許需要一個這樣的結構來描述分配情況:
public class Available
{
public int CurrentUnusedFieldNumber;
public Hashtable FieldToRealName;
}
也許某一時刻的數據狀況是這樣的: CurrentUnusedFieldNumber=3, 哈西表FieldToRealName包含內容是("field0"="SomeId", "field1"="AnyName", "field2=IsOk")
現在的問題是如果要配合Hibernate,如何來處理?以上段的數據使用狀況為例子,如果我們的類定義是這樣:
public class Entity01
{
public string Name;
public string SomeId;
public string AnyName;
public bool IsOk;
}
也許只需要修改一下xxx.hbm.xml,把 SomeId 和 field0 做成對應就ok了。但是在運行時我們怎麼知道會有這樣的類定義?除非我們做動態代碼生成,自動編譯也許可以,但是問題也許就到其他方面去了;如果我們不用動態定義,那麼類就只能是這樣:
public class Entity01
{
public string Name;
public Hashtable ExtraFieldAndValues;
}
使用的時候,用 entity01.ExtraFieldAndValues.setValue("AnyName", "boss") 的方式來引用,也許這樣是修改最少的了,但是問題是Hibernate不支持這樣的方法。
⑹ sql怎麼設置動態欄位名
declare@Sqlnvarchar(1000)
declare@avarchar(10)
set@a='2014-5-22'
set@sql='SELECT*FROM表名aWHERE電話量'+@a+'=a.teltotal'
print(@sql)
exec(@sql)
裡面前面的表名因為你未列出,不好知道你的表結構,以及你是一個表還是兩個表。需要你自己修改一下。
⑺ delphi7 如何動態添加一個資料庫欄位
基本上「動態添加一個資料庫欄位」是資料庫SQL本身的事,與Delphi關系不大。
ADOCommand1.CommandText := 'alter table 表名 add 欄位名1 varchar(12),欄位名2 integer,欄位3 datetime';
ADOCommand1.Execute;
⑻ 如何設計動態欄位的產品資料庫表
可以採用四種技術:
動態增加資料庫表欄位
預留足夠的空白欄位,運行時作動態影射
用xml格式保存在單欄位里
改列為行,用另外一個表存放定製欄位
【一】
現在我們來分析一下四種技術的優劣,不過首先可以排除的是第一點動態增加欄位的方法,因為在實際操作時候幾乎是不可能的(sqlserver太慢,oracle索性不支持),基本可以不討論就排除。剩下後三點。
【二】
先來討論預留空白欄位的方法,基本原理就是在資料庫表設計的時候加入一些多餘的欄位,看下面的代碼:
CREATE TABLE Sample(
name varchar(12),
field0 varchar(1),
field1 varchar(1),
fieldN varchar(1)
}
然後看實際運行時候的需要,動態分配欄位給系統使用,也許需要一個這樣的結構來描述分配情況:
public class Available
{
public int CurrentUnusedFieldNumber;
public Hashtable FieldToRealName;
}
也許某一時刻的數據狀況是這樣的: CurrentUnusedFieldNumber=3,
哈西表FieldToRealName包含內容是("field0"="SomeId", "field1"="AnyName",
"field2=IsOk")
現在的問題是如果要配合Hibernate,如何來處理?以上段的數據使用狀況為例子,如果我們的類定義是這樣:
public class Entity01
{
public string Name;
public string SomeId;
public string AnyName;
public bool IsOk;
}
也許只需要修改一下xxx.hbm.xml,把 SomeId 和 field0
做成對應就ok了。但是在運行時我們怎麼知道會有這樣的類定義?除非我們做動態代碼生成,自動編譯也許可以,但是問題也許就到其他方面去了;如果我們不用動態定義,那麼類就只能是這樣:
public class Entity01
{
public string Name;
public Hashtable ExtraFieldAndValues;
}
使用的時候,用 entity01.ExtraFieldAndValues.setValue("AnyName", "boss")
的方式來引用,也許這樣是修改最少的了,但是問題是Hibernate不支持這樣的方法。
【三】
再來討論單欄位存儲的方法,我們使用這樣的資料庫表定義
CREATE TABLE Sample
(
Name varchar(12),
Xml CLOB(102400) // 僅作說明而已
)
然後對應這樣的類定義
public class Entity01
{
public string Name;
public string Xml;
public Hashtable ExtraNameAndValueFromXml;
}
我們的代碼就可以這樣使用:string id =
entity01.ExtraNameAndValueFromXml.getValue("SomeId")
了。這樣解決看起來很不錯,不僅不需要Available表,而且看起來Hibernate對它的支持也很完美,但是致命的問題在於:如果保持高效的查詢?除非資料庫系統本身對此有支持,否則就只能用低效的substring或者like做查詢,這在大批量數據中根本就不可行。
是不是折衷一下,把兩種方法的優點和起來?問題有來了:怎麼保持兩者之間數據的同步?難道要我們用存儲過程去解析xml內容?
所以,一個兩難的問題,需要我們認真去解決。我們通過認真的需求分析,也許可以減少可變欄位的數量,但是只要有一個可變欄位或者可變的可能性存在,我們始終要去解決這個兩難的問題。
期待繼續討論。
【四】
還有一種方法就是改列為行,用另外一個表存放擴展欄位,定義可以如下:
CREATE
TABLE SampleFields
(
idSample Integer,
fieldName varchar(30),
fieldValue varchar(100)
)
其中idSample關聯到Sample表的id欄位(我沒有寫出來)。這樣的話,Hibernate很容易支持,也可以支持Sql的查詢,而且可以支持把內容放到Hashtable中去,看起來是目前最好的方式了。但是在大容量數據的時候,SampleFields表的數據會是主表數據量的N倍(看定製的欄位數目多少而定),同樣存在有很嚴重的性能問題。