2010-08-11 58 views
7

我正在使用VARCHAR作为我的主键。我想自动递增它(基地62,小写/大写,数字),但是,下面的代码失败(原因很明显):MySQL - 如何使用VARCHAR作为AUTO INCREMENT主键

CREATE TABLE IF NOT EXISTS `campaign` (
    `account_id` BIGINT(20) NOT NULL, 
    `type` SMALLINT(5) NOT NULL, 
    `id` VARCHAR(16) NOT NULL AUTO_INCREMENT PRIMARY KEY 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

然而,这个工程:

CREATE TABLE IF NOT EXISTS `campaign` (
    `account_id` BIGINT(20) NOT NULL, 
    `type` SMALLINT(5) NOT NULL, 
    `id` VARCHAR(16) NOT NULL PRIMARY KEY 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

什么跟踪自己的id增加的最好方法是什么? (由于auto_increment不起作用)。我是否需要制作另一张包含当前ID迭代的表格?还是有更好的方法来做到这一点?

编辑:我想澄清一点,我知道使用INT是一个auto_increment主键是合乎逻辑的路要走。这个问题是为了回应我之前看到的一些对话。由于

+0

Offtopic:你确定要使用MyISAM吗?对于关系数据库,您需要在MySQL中使用innoDB来创建外键。 – 2010-08-11 06:36:56

+1

不,我不确定。我一直在使用MySQL已经有一段时间了,但是,有人告诉我应该在大部分时间使用MyISAM,并且我只是用它来做:P – 2010-08-11 12:20:31

回答

5

,你必须使用一个INT领域
和选择时间

+0

这在我的情况下是不可能的,因为ID是作为部分传递的的网址。 – 2010-08-11 06:05:33

+0

此外,我特别寻找手动增加ID的最佳方法。我知道Bit.ly和可能的Tiny URL做的事情非常相似。 – 2010-08-11 06:06:12

+0

@Kenny大声笑一切都是可能的程序员:)转换之前传递给查询。没什么大不了的。正如我所说,这些网址缩写符会这样做。 – 2010-08-11 06:10:38

0

例如它翻译成你想要的任何格式的解决你的问题:

创建一个文件,一个唯一的编号,然后增加一个功能。

文件名可以是前缀,文件二进制内容代表一个数字。

当你需要一个新的ID的REG invoque功能

String generateID(string A_PREFIX){ 
     int id_value = parsetoInt(readFile(A_PREFIX).getLine()) 
     int return_id_value = id_value++ 
     return return_id_value 
    } 

其中“A_PREFIX-”是文件名至极用来生成该字段的ID。