簡體   English   中英

在連續的數字序列和 LAST_INSERT_ID 中填充已刪除的數字

[英]Fill deleted numbers in consecutive series of numbers and LAST_INSERT_ID

首先,我是一個業余和非英語母語人士,所以如果你對我有一點耐心,我將不勝感激;)

在這里嘗試做兩件事,我不確定我是否應該就此做兩個問題,但由於這一切都與我的情況有關,我想在一個問題中全部說出來。

我正在制作一種會計軟件,理論上供我個人使用。 我幾乎所有對象都使用數據庫生成的 auto_increment ID,但對於某些特定情況,我需要一個“並行”更開放的 ID,它不會是主鍵但可以由用戶操作(是的,我讀過很多關於“你不需要連續的主鍵”的問題,我理解並同意,但讓我說這個列不會是主鍵,讓我們稱之為“人而不是計算機-專家友好 ID") 匹配這些條件:

  • 當沒有給出參數時,Id 應該自動增加。
  • 當一個數字作為參數給出時,如果未被占用,則應使用該數字,如果被占用則拋出異常。
  • 應該詢問用戶他/她是否想通過DELETE s 和任何其他操作來填充缺失的 ID,因此如果用戶“說是”,應該自動找到並使用最小的缺失 ID。

我在 c# 中“手動”執行此操作沒有問題,但是有什么方法可以直接在 MySQL 中實現這樣的功能嗎? 我在 MySQL 文檔中讀到AUTO_INCREMENT確實滿足我的前兩個條件,但即使它默認填充缺失的已刪除數字,我不確定,我不希望它默認這樣做,我需要軟件首先詢問,或者至少根據用戶預先建立的配置來執行。

因此,我認為我應該在 c# 中手動完成(至少是最后一部分,但我懷疑我將被迫完全完成),這帶來了關於LAST_INSERT_ID的問題。

所以,MYSQL 文檔說:

如果前面的語句返回錯誤,則 LAST_INSERT_ID() 的值未定義。 對於事務表,如果語句因錯誤而回滾,則 LAST_INSERT_ID() 的值未定義。 對於手動 ROLLBACK,LAST_INSERT_ID() 的值不會恢復到事務前的值; 它保持在回滾時的狀態。

我知道如果之前的INSERT語句因任何原因失敗, LAST_INSERT_ID()基本上是無用的。

如果是這種情況,有沒有辦法檢索最后插入的 ID 以確保出現故障時的已知行為? 類似於INSERT失敗時返回 0 或 SQL 異常? 如果沒有其他方法,那么標准的做法是什么(我想MAX(Id)不會這樣做),如果存在類似標准的方法……或者我應該立即停止嘗試這樣做並首先執行更新,檢查是否一切正常,然后執行SELECT LAST_INSERT_ID

總結:

  • 有沒有辦法直接在 MySQL 中實現一列滿足給定條件的連續數字?
  • LAST_INSERT_ID怎么回事? 我應該放棄並且不直接使用它嗎?

情況 1,知道要插入AUTO_INCREMENT的 id

尊重 AI 不是所描述的 PK。

-- drop table a12b;
create table a12b
(   id varchar(100) primary key,
    ai_id int not null AUTO_INCREMENT,
    thing varchar(100) not null,
    key(ai_id)
);

insert a12b (id,thing) values ('a','fish'); -- ai_id=1
insert a12b (id,thing) values ('b','dog'); -- 2
insert a12b (id,thing) values ('b2','cat'); -- 3
delete from a12b where id='b';
insert a12b(id,ai_id,thing) values ('b',2,'dog with spots'); -- 2 ******** right here
insert a12b (id,thing) values ('z','goat'); -- 4

select * from a12b;
+----+-------+----------------+
| id | ai_id | thing          |
+----+-------+----------------+
| a  |     1 | fish           |
| b  |     2 | dog with spots |
| b2 |     3 | cat            |
| z  |     4 | goat           |
+----+-------+----------------+
4 rows in set (0.00 sec)

情況 2,有一個系統,您可以在某個時候刪除行。 並希望稍后填補那些明確刪除的空白: 在此處查看我的答案

情況 3(INNODB 到處散布着一堆空白):

這不是問題的一部分。 也許使用使用輔助表的左連接(至少對於整數而不是 varchars。但是我們又在談論整數)。 如果您需要在不知情的情況下發現差距,請使用輔助表(裝有數字)進行左連接。 我知道這聽起來很蹩腳,但輔助表精益求精,可以完成工作。 以下將是一個輔助表: https : //stackoverflow.com/a/33666394

INNODB 間隙異常

使用上表的 4 行,繼續:

insert a12b (id,thing) values ('z','goat'); -- oops, problem, failed, but AI is incremented behind the scene
insert a12b (id,thing) values ('z2','goat'); -- 6 (you now have a gap)

data:
+----+-------+----------------+
| id | ai_id | thing          |
+----+-------+----------------+
| a  |     1 | fish           |
| b  |     2 | dog with spots |
| b2 |     3 | cat            |
| z  |     4 | goat           |
| z2 |     6 | goat           |
+----+-------+----------------+

有很多方法可以產生差距。 看到這個那個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM