Insert
SQL插入更新一個表並根據欄位值選擇其他表需要更新的內容
數據庫設置:MSSQL
我有一個通過 API 呼叫傳入的源記錄。該呼叫旨在更新數據庫中的系統。
第一個表是一個通用表,所有系統都有一些詳細資訊
SystemId | SystemName | Type | Memory | Storage | Etc...... -----------+--------------+-----------+-----------+----------- 92 | Server1 | BlueType | 16GB | 10TB | 96 | Server2 | RedType | 24GB | 20TB | ... ...
然後我至少有 2 個表,每個表都有與系統特定角色相關的不同欄位:
BlueId | BrokerName | Threshold | TriggerLevel | Etc...... --------+--------------+-----------+---------------+----------- 41 | Palooza | 400 | 4 | 42 | Almamater | 900 | 3 | ... ...
RedId | Parent | MetalCast | Available | Etc...... --------+-------------+-----------+------------+----------- 87 | Pindle | Yes | Yes | 88 | Feldspar | No | No | ... ...
提供數據的來源將在一份聲明中送出。該聲明將來自一個知道它是什麼“類型”(紅色、藍色等)的來源,並且將具有與該類型相關的適當欄位。
例如,如果語句來自“紅色”類型的系統,則語句將類似於以下內容:
SystemName = CrosserTT1 Type = BlueType Memory = 20GB Storage = 10TB BrokerName = PintoCall Threshold = 250 TriggerLevel = 6 etc....
這意味著我需要獲取這些數據,用適當的欄位更新上面的“Common”表,確定“Type”的值是什麼,並根據類型值用適當的欄位更新適當的表。在上面的範例中,我想更新公共表,然後根據類型的值更新 Blue 表。在這種情況下,我什至不想碰紅色的桌子。
這些是我想知道的事情:
- 這是否有可能有一個一次性可以更新通用的插入語句,選擇要更新的類型表,然後去更新?
- 我是否應該有一個包含所有類型的所有欄位的表,並且只將數據添加到適合該類型的列中?
- 我是否應該有一個包含 COMMON 的表,其中包含所有與系統相關的所有欄位,並將與記錄不相關的欄位留空?
我正在嘗試確定針對此類事情的最佳實踐——性能和簡單性。
就上面範例的插入語句而言,擁有一個儲存過程並為其提供所有值是否更有意義?
感謝您的寶貴意見。
如果您需要澄清,請告訴我。
您要查找的內容稱為Trigger。
例如:
https://sqlite.org/lang_createtrigger.html
我為 sqlite 編寫了一個小範例,您可以在任何 unix/linux 系統上重複所有內容。
init.sh:
# cat init.sh echo "CREATE TABLE 'first_table' ( id integer primary key, \ name text DEFAULT 'noname', \ type text DEFAULT 'blue', \ blabla int DEFAULT 0 \ );" echo "CREATE TABLE 'blue_table' ( id integer primary key, \ name text DEFAULT 'noname', \ blabla int DEFAULT 1 \ );" echo "CREATE TABLE 'red_table' ( id integer primary key, \ name text DEFAULT 'noname', \ blabla int DEFAULT 2 \ );" echo "CREATE TRIGGER t1 AFTER INSERT ON first_table \ FOR EACH ROW \ WHEN NEW.type != 'blue' \ BEGIN \ INSERT INTO blue_table ( name ) VALUES ( NEW.name ); \ END;" echo "CREATE TRIGGER t2 AFTER INSERT ON first_table \ FOR EACH ROW \ WHEN NEW.type != 'red' \ BEGIN \ INSERT INTO red_table ( name ) VALUES ( NEW.name ); \ END;" echo "INSERT INTO first_table ( name, type ) VALUES ( 'ololo1', 'red' ), ( 'ololo2', 'blue' ), ( 'ololo3', 'blue' ), ( 'ololo4', 'red' );"
首先,在這裡,您將創建 3 個表,然後創建 2 個觸發器,根據
type
欄位觸發,如果類型是“紅色” - 觸發第一個觸發器,如果類型是“藍色” - 另一個。用法:
# bash init.sh | sqlite3 tmp.db # echo "SELECT * FROM red_table;" | sqlite3 tmp.db 1|ololo2|2 2|ololo3|2 # echo "SELECT * FROM blue_table;" | sqlite3 tmp.db 1|ololo1|1 2|ololo4|1