我有一个表,其中有 4 列的组合将充当唯一键。
我想保留一个 id 列作为主键,而不是使用复合主键。该字段在 auto_increment 上。对数据库的插入是通过 C 接口完成的。当插入一行时,我想知道它被分配的 id。LAST_INSERT_ID() 可用于检索它,但会有多个会话插入到表中。在这种情况下 LAST_INSERT_ID() 会返回正确的值吗?
我已经阅读了这篇文章:MySql 的 LAST_INSERT_ID() 函数保证正确吗? 它表示插入多行时返回第一个插入行的 id。
当多个会话写入同一个表但单个会话一次只写入一行时,是否可以检索生成的 id 的正确值?隔离级别也重要吗?
是否可以使用 2 个自动增量值?
请帮我
我有一个使用以下 T-SQL 创建的表:
CREATE TABLE [dbo].[TableName](
[id] [int] IDENTITY(1,1) NOT NULL
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我今天查看了这张表,注意到 id 列正在跳过值:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26、27、1027、1028、1029、1030、1031、1032、1033、1034、1035、2034、2035、3034
我不担心这个或任何事情(我的应用程序不关心主键是什么),我只是想知道可能导致这种情况发生的原因。似乎确实有一种模式,每次“跳跃”发生时跳跃 1000。
我的应用程序使用实体框架插入这些行,如果这有什么不同的话。
sql-server entity-framework auto-increment identity sql-server-2012
我有一个表,其中包含进入其他表的几个键(其中每个键由多列组成)。我想为每个键创建一个新列,该列将是一个整数,以便该值i表示该ith键的出现(但我希望该排序是随机的)。我想也许某种自动增量会起作用,但我有多个键,因此需要多列(我相信只允许一个自动增量)。
我想出的解决方案似乎不起作用。首先,我创建了一个新表来存储我感兴趣的列,以及一个额外的列rnd. 我rnd稍后会ORDER BY rand()在需要实际列而不是函数的上下文中使用。这是我如何完成第一点:
SET @rnd = 0;
INSERT INTO new_table SELECT col1, ..., colN, @rnd := @rnd+1 FROM original_table ORDER BY rand();
Run Code Online (Sandbox Code Playgroud)
接下来,我将根据键添加一个自动增量,并使用rnd我刚刚创建的列。在ALTER TABLE...ORDER BY不通过函数(如允许排序rand()),所以这就是为什么我需要创建的rnd第一列:
ALTER TABLE new_table ADD first_index INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD KEY(col1, col2, first_index), ORDER BY rnd;
Run Code Online (Sandbox Code Playgroud)
然后我会删除自动增量状态并为每个键重复:
ALTER TABLE new_table MODIFY COLUMN first_index INT UNSIGNED NOT NULL;
Run Code Online (Sandbox Code Playgroud)
起初,这似乎奏效了。然而,仔细检查后,似乎没有遵守随机排序。索引列的创建顺序与原始表碰巧使用的顺序相同。当我经历了几个非常尴尬的步骤以确保随机排序时,我感到相当沮丧,而这甚至不起作用。为什么我的解决方案不起作用,有没有更优雅的方法来做到这一点?
编辑:显然我不清楚我在找什么,所以我会尝试一个简单的例子:
Col1 Col2 <other columns>
1997 …Run Code Online (Sandbox Code Playgroud) 为什么我的数据库需要有一个主键才能正常运行?在我阅读的每个教程中,您都需要将 id 键设为主键。主键的作用与常规单元格有何不同?
这个问题几乎说明了一切。我们在这里谈论 MySQL,版本 5.1。
我想知道的是这是否严格意味着行已被删除,或者是否有其他可能的情况可能导致这种情况:奇怪的锁定或竞争条件等,迫使表的ID计数器为一次插入多次递增。
我在 PostgreSQL 中有一个用于医院患者的表,我想将它的主键设置为PAT0000001( char varying) 并将该字段保持为自动增量。
有没有办法实现这一目标?
我的 PostgreSQL 数据库中有一个简单的表,如下所示:
CREATE TABLE person_type
(
id serial NOT NULL,
name character(55) NOT NULL,
CONSTRAINT person_type_pkey PRIMARY KEY (id),
CONSTRAINT person_type_name_key UNIQUE (name)
)
Run Code Online (Sandbox Code Playgroud)
如您所见,id会自动递增,并且名称必须是唯一的。每次我运行 INSERT sql 语句时,即使它失败,id 也会增加 1。
我怎样才能防止这种情况?为了每次成功插入一行,主键是相关的
我在我的数据库中做了一些插入测试,我意识到当 INSERT 语句失败时,由于错误 1452,导致 auto_increment 值增加 1。即使在这个语句中没有插入任何行。
因此,此行为导致下一个有效插入跳过 auto_increment 的可用和可能值。
例子:
1st Insert | Result: Success | id(auto_increment_column): 1 |
2nd Insert | Result: Failure | -------- No rows were recorded---- |
3nd Insert | Result: Success | id(auto_increment_column): 3 |
Run Code Online (Sandbox Code Playgroud)
我想知道之前是否有人遇到过这个问题,这是否真的是一个问题。
干杯。
PS:
错误:1452 - fk 约束失败。这意味着我试图引用另一个表中的某个列值,但该值在那里不存在。
与 MySQL MyISAM-Engine 相比,InnoDB-Engine 无法处理复合主键的一列声明为AUTO_INCREMENT. 例如,考虑下表:
CREATE TABLE `ExampleTable` (
`KeyPartA` mediumint(8) unsigned NOT NULL,
`KeyPartB` smallint(5) unsigned NOT NULL,
`Data` text NOT NULL,
PRIMARY KEY (`KeyPartA`,`KeyPartB`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)
现在模拟AUTO_INCREMENT,我了解到,可以创建以下触发器
DELIMITER $$
CREATE TRIGGER ExampleAutoIncrement BEFORE INSERT ON ExampleTable
FOR EACH ROW BEGIN
SET NEW.KeyPartB = (
SELECT IFNULL(MAX(KeyPartB), 0) + 1
FROM ExampleTable
WHERE KeyPartA = NEW.KeyPartA
);
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
现在插入工作正常,生成自动递增的值。不幸的是,我想不出一种明智的方法来获取新创建的键值。
由于LAST_INSERT_ID()没有实际的AUTO_INCREMENT列,因此它的 C 对应项都不会返回它。也不能LAST_INSERT_ID(IFNULL(MAX(KeyPartB), 0) + 1)在 …
auto-increment ×10
mysql ×6
primary-key ×3
innodb ×2
postgresql ×2
identity ×1
insert ×1
mysql-5.1 ×1
order-by ×1
phpmyadmin ×1
random ×1
sql-server ×1
trigger ×1