2017-07-31 18 views
0

我找不到任何說明您在PRIMARY KEY字段上不能有DEFAULT值的文檔。然而我對這個測試代碼的實驗並沒有完成。它被接受爲有效,但只是生成(n + 1)的值。它適用於非主鍵字段。SQLite表的主鍵是否有一個自定義的默認值?

CREATE Table A (
    id INTEGER PRIMARY KEY default(random()) 
) 

這可能嗎?

+1

主鍵對於每一行必須是唯一的。所以默認值是無意義的。此外,生成隨機數字(不必介意「主鍵」)並不保證是唯一的。事實上,很可能會有重複的價值。 – radarbob

+0

這純粹是一個簡單的例子來說明問題。它並不是實用的。 – Nicholas

+0

嗯,好吧,讓我拋出一些隨機想法..作爲一個技術定義主鍵在表中是唯一的。一個鍵可能由多個列組成 - 只要「複合鍵」是唯一的 - 某個行的鍵列可能有重複的值,但只要完整的複合鍵是唯一的,就沒有問題。最後,還要意識到表中不需要主鍵。 – radarbob

回答

2

integer primary key是SQlite中的一種關鍵字,它是rowid的別名,如果您提供了SQlite,它將默默忽略您的默認設置。

所以,你有兩種解決方案:

  1. 創建一個表,而rowid

    create table A (id integer primary key default(random())) without rowid; 
    
  2. 聲明id的東西,是一個整數的主鍵,而不使用 「關鍵字」 integer primary key,爲通過將integer替換爲int的示例:

    create table A (id int primary key default(random())); 
    

關於您是否想採取without rowid路線,您可以閱讀this section的文檔。

+0

我認爲你的第一個解決方案承諾看看它的文檔。然而,當嘗試時,兩種解決方案仍然在該領域返回(n + 1)。你有不同的結果嗎? – Nicholas

+0

是的,兩者都適用於我。你有哪些版本的SQlite? – user1735003

+1

呵呵。好的,現在我已經有了你的解決方案。問題原來是我使用的SQLite接口'DB Browser for SQLite' - 或者至少是我用它來測試這種情況的方式。我正在創建表格,然後用GUI'New Record'按鈕添加行。出於某種原因總是添加行(n + 1)。當我通過鍵入SQL插入切換到插入測試行時,這兩個默認值解決方案開始工作。 – Nicholas

0

您可以使用autoincrement

CREATE Table A (
    id INTEGER PRIMARY KEY AUTOINCREMENT 
); 

嚴格地說,這是沒有必要的,因爲SQLite的有一個內置的rowid

+0

雖然這是真的,但這不是我正在處理這個問題的地方。我編輯了這個問題,使其更具體。 – Nicholas

相關問題