我在数据库中有表,而初始键是'ID',我想问一下如何才能使它成为AUTOINCREMENT
我知道那是esay Q,但我不知道我该怎么做.
谢谢
我想生成一个简短的唯一ID,而不必检查冲突.
我目前做这样的事情,但我目前生成的ID是随机的,并且在循环中检查冲突是令人讨厌的,并且如果记录数量显着增加将会变得昂贵.
通常担心碰撞不是问题,但我想要生成的唯一ID是一个短的唯一字符串5-8个字符,字母数字,就像tinyurl一样.
编辑:我想从5个字符开始,如果我达到6000万条目,那么去6 ...等等.
为此,我想我可以使用对用户隐藏的auto_increment值,而是用一个MD5或其他方法来呈现它们以从中生成唯一的字符串.
生成的字符串看起来不应该是线性的,所以简单地将auto_incremented ID转换为base 36[0-9A-Z]有点过于简单了,但是这样的函数就是我要用的东西.
编辑:安全性不是问题,因为这不会用于保护信息.它只是更长字符串的快捷方式.谢谢.
感谢您的建议,抱歉延误.牙医..
从MySQL的最新源代码(不确定它是C或C++),它如何进行自动增量?我的意思是,它是否有效,因为它像元数据资源一样存储在它最后停止的表上,或者它是否必须进行表扫描才能找到表中使用的最大ID?另外,当你看看它是如何实现的时候,你会看到使用自动增量的任何负面影响,比如PostgreSQL吗?
我读到的有关重新种植的所有文件都表明了以下内容:
SET @maxIdentityValue = (SELECT MAX(id) FROM tablename)DBCC CHECKIDENT('tablename', RESEED, @maxIdentityValue)而尚未在我看来,一个简单的DBCC CHECKIDENT('tablename', RESEED)是所有的需要,它会自动确定从表中的正确标识值,而无需提供一个最大值.
是否有理由(性能或其他方面)MAX首先使用首先提取值?
背驮式问题:我需要重新设置的原因是因为我每次数据库复制运行时都使用复制和身份设置为Null.我究竟做错了什么?如何为每个表维护正确的标识种子?
现在我没有使用最大值.这是我正在使用的存储过程(我使用查询生成它sys.columns然后只是将每个切割并粘贴到一个新的查询窗口.Messier,更慢,更不优雅,但我不是很熟悉存储过程而且'不'我想使用动态SQL查询):
declare @seedval integer
declare @maxval integer
declare @newval integer
set @seedval = (select ident_current('mytable'));
set @maxval = (select MAX(id) from mytable);
if @maxval > @seedval or @seedval is NULL
BEGIN
print 'Need to reseed: max is ' + cast(@maxval as varchar) + ' and seed is ' + cast(@seedval as varchar)
dbcc …Run Code Online (Sandbox Code Playgroud) 在doctrine2中,我有一个实体,它具有从Web服务中获取的主键,并且还有一个应该是自动增量的索引.
我可以在mysql中手动设置,但不能在doctrine2中使这个工作.
zend-framework primary-key auto-increment symfony doctrine-orm
我有一个BEFORE INSERT TRIGGER用于计算AUTO_INCREMENT列(id_2)的值.
id_1 | id_2 | data
1 | 1 | 'a'
1 | 2 | 'b'
1 | 3 | 'c'
2 | 1 | 'a'
2 | 2 | 'b'
2 | 3 | 'c'
2 | 4 | 'a'
3 | 1 | 'b'
3 | 2 | 'c'
Run Code Online (Sandbox Code Playgroud)
我有PRIMARY(id_1,id_2),我正在使用InnoDB.以前,该表使用的是MyISAM,我没有遇到任何问题:id_2设置为AUTO_INCREMENT,所以每个新条目id_1都会id_2自行生成新的.现在,在切换到InnoDB后,我有这个触发器做同样的事情:
SET @id = NULL;
SELECT COALESCE(MAX(id_2) + 1, 1) INTO @id FROM …Run Code Online (Sandbox Code Playgroud) 每当我在a 之后直接做一个SELECT语句时,我得到最后一个插入的行.WHERE id is NULLINSERT
我正在使用MySQL 5.1.73.
它直接发生在MySQL shell中; 这是我的控制台:
mysql> CREATE TABLE testing (
-> id int(11) NOT NULL AUTO_INCREMENT,
-> name VARCHAR(200),
-> PRIMARY KEY (id)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO testing (name) VALUES ('test');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM testing WHERE id IS NULL;
+----+------+
| id | name |
+----+------+
| 1 | test |
+----+------+ …Run Code Online (Sandbox Code Playgroud) 我有一个db中的现有表,其他几个FK,SQL如下:
CREATE TABLE forecastsource (
source_id integer DEFAULT nextval(('public.forecastsource_source_id_seq'::text)::regclass) NOT NULL,
source_name character varying NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我想从id字段中删除自动增量,然后将其移动到一个int字段(不丢失表中的当前数据).除了删除和重新创建表之外,我该怎么做?
这是表的格式:
indexer group name id
1 abc a
2 abc b
3 xyz c
4 abc e
5 xyz d
Run Code Online (Sandbox Code Playgroud)
现在我希望它像,
indexer group name id
1 abc a 1
2 abc b 2
3 xyz c 1
4 abc e 3
5 xyz d 2
Run Code Online (Sandbox Code Playgroud)
"id"应根据"group"自动递增
auto-increment ×10
mysql ×6
sql-server ×2
architecture ×1
c ×1
c++ ×1
database ×1
doctrine-orm ×1
innodb ×1
insert ×1
null ×1
php ×1
postgresql ×1
primary-key ×1
select ×1
sql ×1
symfony ×1
triggers ×1
unique ×1