2017-01-01 29 views
1

我必須將舊的Paradox數據庫遷移到MySql。 Paradox數據庫包含具有空值的複合主鍵(複合鍵由3,4或5個字段組成,並且它可以具有1或2個具有空值的字段)。問題是在MySql中不允許使用pk中的空值。在Paradox中直接替換空值是不可能的(某些表中有500萬行),那我們怎麼辦?如何在MySql中替換空主鍵

在此先感謝您的解決方案。

+0

Paradox表結構不允許爲空大多數其他的數據庫設計的定義,即值不匹配任何東西,甚至另一個爲空。在大多數數據庫都有空值的地方,Paradox有空白。由於MySQL沒有空格,因此您需要爲每個數據類型定義一個空值。 - 另見http://stackoverflow.com/questions/10228123/how-does-paradox-manage-null-and-empty-values/13282514#13282514 –

回答

0

我認爲你必須在MySQL數據庫兩種選擇,

(一)採用一次PK,這就需要更換空值/忽略這樣的行

(B)使用獨特 - 約束,它仍然允許空值,而不是PK。

對於選擇(a),

我建議禁用主鍵約束和導入數據;然後執行所有必要的更正並重新激活主鍵。如果要刪除潛在PK列中的空值的行,還可以使用關鍵字,該關鍵字在插入時跳過違反PK約束的行(參見primary key and unique index constraints

選項(b) ,

應該允許按原樣導入數據。然後,您可以執行更正或保持原樣。

0

假設PK中的零點意味着它們不需要是唯一的,它們可以是任何值,因此將一個任意值賦給空值。

要做到這一點,在MySQL表這樣創建觸發器:

delimiter // 
create trigger trig_pk_col_1 before insert on mytable 
for each row 
begin 
    set new.pk_col_1 = coalesce(new.pk_col_1, 999); 
    set new.pk_col_2 = coalesce(new.pk_col_2, 999); 
    -- etc for other 
end;// 
delimiter ; 

我選擇999爲任意非空值,但你可以選擇任何東西。

如果邏輯需要更加複雜,您可以根據自己的喜好進行編碼。

另外,我用coalesce()爲了簡潔,但是你可以用更詳細的if,而不是如果你喜歡:

if new.pk_col_1 is null then 
    set new.pk_col_1 = 999; 
end if; 
-- etc