天道酬勤,学无止境

auto-increment

SQLite: *prevent* PRIMARY KEY value from resetting after delete all rows [duplicate]

问题 这个问题在这里已经有了答案: 不要使用已删除的主键1 个回答 5年前关闭。 我有一个 SQLite 表,有几列,包括一个“ID”列,它是 INTEGER PRIMARY KEY。 当我插入时,这个值会按预期增加。 但是,当我删除所有行时,该列的值会在下一次插入时恢复为 1。 有没有办法让列值从删除前的最大值继续递增? 例如: (空表) 插入插入 (第 2 行的 ID 值为 2,下一个插入为 3) 删除所有行插入 (最新行的 ID 值为 1,但我希望它为 3) 回答1 如果 AUTOINCREMENT 关键字出现在 INTEGER PRIMARY KEY 之后,则会更改自动 ROWID 分配算法,以防止在数据库的生命周期内重复使用 ROWID。 换句话说,AUTOINCREMENT 的目的是防止重复使用以前删除的行中的 ROWID。 https://www.sqlite.org/autoinc.html 回答2 您使用的是什么版本的 SQLite? 我正在使用SQLite version 3.8.11.1 。 主键值未重置。 创建表并插入一些数据 sqlite> create table test (id integer primary key autoincrement, name varchar(20)); sqlite> select * from test

2022-05-12 06:29:18    分类:技术分享    sqlite   auto-increment

Alternative to "PDO::lastInsertId" / "mysql_insert_id"

问题 我总是听说使用“lastInsertId”(如果您不使用 PDO,则使用 mysql_insert_id())是邪恶的。 如果是触发器,显然是这样,因为它可能会返回完全不是您的 INSERT 创建的最后一个 ID 的东西。 $DB->exec("INSERT INTO example (column1) VALUES ('test')"); // Usually returns your newly created ID. // However when a TRIGGER inserts into another table with auto-increment: // -> Returns newly created ID of trigger's INSERT $id = $DB->lastInsertId(); 有什么选择? 回答1 恕我直言,它只被认为是“邪恶的”,因为几乎没有任何其他 SQL 数据库(如果有的话)拥有它。 我个人觉得它非常有用,并希望我不必在其他系统上求助于其他更复杂的方法。 回答2 一种替代方法是改用序列,因此您在插入之前自己生成 ID。 不幸的是,它们在 MySQL 中不受支持,但像 Adodb 这样的库可以使用另一个表来模拟它们。 但是,我认为仿真本身将使用 lastInsertId() 或等效项

2022-05-10 12:10:09    分类:技术分享    php   mysql   auto-increment   lastinsertid   mysql-insert-id

How do I not waste Generator values when using them server side with Firebird?

问题 检查这个使用生成器在 Firebird 表中创建唯一主键的简单代码: CREATE OR ALTER TRIGGER ON_BEFOREINSERT_PK_BOOKING_ITEM FOR BOOKING_ITEM BEFORE INSERT POSITION 0 AS BEGIN IF ((NEW.booking_item_id IS NULL) OR (NEW.booking_item_id = 0)) THEN BEGIN SELECT GEN_ID(LastIdBookingItem, 1) FROM RDB$DATABASE INTO :NEW.booking_item_id; END END! 此触发器抓取并递增,然后为预订项目 ID 分配生成的值,从而为 BOOKING_ITEM 表创建一个自动递增的键。 触发器甚至会检查预订 ID 是否尚未被赋值。 问题是如果由于某种原因无法发布 BOOKING_ITEM 记录,则自动增加的值将丢失(浪费)。 关于如何避免这种浪费,我有几个想法,但对每一个都有顾虑。 他们来了: 如果发生过帐错误,则减少计数器。 在触发器中,我设置了一个 try-except 块(在 Firebird PSQL 中是否存在 try-except 块?)并在发布异常时运行SELECT GEN_ID(LastIdBookingItem, -1)

2022-05-09 16:11:54    分类:技术分享    sql   triggers   generator   firebird   auto-increment

In a master-master setup, what command or files do I edit so that it can auto-increment by 2?

问题 一台服务器递增 1、3、5。 另一个服务器增量 2, 4, 6 回答1 基于这个有见地的教程:http://www.howtoforge.com/mysql_master_master_replication#comment-12927 通过将其添加到 [mysqld] 下的 my.cnf 中,使 Master 1 仅自动递增奇数: auto_increment_increment= 2 auto_increment_offset = 1 通过将其添加到 [mysqld] 下的 my.cnf 中,使 Master 2 仅自动递增偶数: auto_increment_increment= 2 auto_increment_offset = 2

2022-05-07 05:30:03    分类:技术分享    mysql   database   replication   auto-increment

When to fix auto-increment gaps in MYSQL

问题 我现在正在处理的数据库中有成千上万的记录被添加和删除,因此在自动递增的密钥中存在数十万大的差距,并且自动递增的数字达到数十亿。 这些数字永远不会存储以引用单个记录,而是用于在进行动态计算时引用记录。 是否有任何理由消除这些差距并重置自动递增数,或者这无关紧要? id 字段是无符号整数,我应该将其增加到无符号大整数吗? 据我了解,现在如果它达到 4,294,967,295,它就会崩溃。 回答1 我担心的唯一原因是,如果您发现自己接近 2^32 限制。 如果您不使用该列作为行 ID,那么甚至不用担心。 编辑如果您将此列用于任何类型的识别信息,那么我会将列切换到 GUID 或其他内容,因为您会溢出,然后您将获得重复值。 那不是bueno。 回答2 我不知道您的自动增量字段的增长率是多少,但是您应该通过简单的数学来估算您何时会达到 4294967295 的限制。 如果您仍然觉得需要做某事,您有以下选择: 将当前计数重置为 1。理想情况下,删除列并重新创建它。 由于您没有将此字段用于参照完整性,因此应该是一个快速简单的修复,直到下一次...... 将数据类型更改为无符号 BIGINT。 现在你可以达到 18446744073709551615。但是你需要更多的堆空间来存储这个增加的数据量,而你只是推迟了你的问题。 从自动增量(INT / BIGINT)更改为 UUID。

2022-05-06 14:47:15    分类:技术分享    mysql   auto-increment

Sequences with composite primary key

问题 使用 PostgreSQL,我如何管理以下场景的序列(自动递增的整数 id)- 名为“businesses”的表,其中包含“id”和更多列。 名为“用户”的表具有: 一个复合主键,由一个“business_id”和一个“id”组成,并让“id”重置它在我现在插入行时为每个“business_id”计数。 一个简单的列“名称”。 就像每个企业有一个单独的序列一样。 例子 当我运行以下查询时: 插入用户(business_id,name)值(1,'a') 插入用户(business_id,name)值(2,'b') 插入用户(business_id,name)值(1,'c') 我想最终得到以下“用户”表: 业务 ID、ID、名称 1, 1, '一个' 1, 2, 'c' 2, 1, 'b' 回答1 INSERT INTO [users] (business_id, id) FROM ( SELECT ID - (SELECT MIN(ID) FROM [users] WHERE business_ID = B.ID) AS business_id ,(SELECT MAX(ID)+1 FROM [users] WHERE business_ID = B.ID) AS ID FROM [businesses] B ) 如果将此链接到要添加的新条目,它应该提供复合键 新更新:

2022-05-06 13:07:43    分类:技术分享    postgresql   primary-key   auto-increment   composite-primary-key

How do I not waste Generator values when using them server side with Firebird?

Check this simple piece of code that uses a generator to create unique primary keys in a Firebird table: CREATE OR ALTER TRIGGER ON_BEFOREINSERT_PK_BOOKING_ITEM FOR BOOKING_ITEM BEFORE INSERT POSITION 0 AS BEGIN IF ((NEW.booking_item_id IS NULL) OR (NEW.booking_item_id = 0)) THEN BEGIN SELECT GEN_ID(LastIdBookingItem, 1) FROM RDB$DATABASE INTO :NEW.booking_item_id; END END! This trigger grabs and increments then assigns a generated value for the booking item id thus creating an auto-incremented key for the BOOKING_ITEM table. The trigger even checks that the booking id has not already been

2022-05-03 02:54:42    分类:问答    sql   triggers   generator   firebird   auto-increment

mysql Getting the same auto_increment value into another

问题 这可能有一个非常简单的答案。 我已经做了很多数据库的东西了。 我正在尝试从一个表中获取 auto_increment 值,并将其插入另一表中的值中。 有没有一种简单的方法可以做到这一点。 例如我做了: CREATE TABLE table_a ( id int NOT NULL AUTO_INCREMENT, a_value varchar(4), PRIMARY KEY (id) ); CREATE TABLE table_b ( id int NOT NULL, b_value varchar(15), FOREIGN KEY (id) REFERENCES table_a (id) ); 现在我想将值插入表中,但我希望 table_a 和 table_b 的“id”值相同。 到目前为止,我有: INSERT INTO table_a VALUES (NULL, 'foobar'); 但我不知道如何从 table_a 中提取 auto_incermented 'id' 数字到 table_b 的 'id' 值中。 我看过 SELECT @id = LAST_INSERT_ID() 但无法让它工作。 回答1 你不能一下子做到这一点。 您必须先插入第一个表: INSERT INTO table_a (a_value) VALUES ('foobar'); 然后使用生成的 id

2022-05-01 03:28:08    分类:技术分享    mysql   insert   foreign-keys   auto-increment

Sequences with composite primary key

Using PostgreSQL, how do I manage a sequence (auto incremented Integer id) for the following scenario- Table named 'businesses' which has 'id' and some more columns. Table named 'users' which has: a composite primary key, composed of a 'business_id', and an 'id', and have the 'id' reset it's counting for each 'business_id' when I insert now rows. a simple column 'name'. something like having a separate sequence per business. Example When I run the following queries: insert into users (business_id, name) values (1, 'a') insert into users (business_id, name) values (2, 'b') insert into users

2022-04-29 19:25:47    分类:问答    postgresql   primary-key   auto-increment   composite-primary-key

In a master-master setup, what command or files do I edit so that it can auto-increment by 2?

One server increment 1, 3, 5. The other server increment 2, 4, 6

2022-04-29 14:32:44    分类:问答    mysql   database   replication   auto-increment