Insert

SQL插入更新一個表並根據欄位值選擇其他表需要更新的內容

  • December 14, 2020

數據庫設置: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

引用自:https://dba.stackexchange.com/questions/281532