通常,当我创建新表时,我会将一个名为id
的列设置为primary,并将其设置为自动递增。
在我正在处理的新项目中,对于每一行,我需要一个特定长度的唯一ID,在这种情况下需要15个字符。
所以我的问题是,使用这个15个字符的数字ID代替自动递增ID是否存在问题?是否有使用自动递增数字的技术原因?
我用这个来生成ID,所以据我所知,它们是唯一的:
$randNum = preg_replace('/[.:]/', '', time().$_SERVER['REMOTE_ADDR']).randomNumber(4)
function randomNumber($length) {
$result = '';
for($i = 0; $i < $length; $i++) {
$result .= mt_rand(0, 9);
}
return $result;
}
更好的算法?
$randNum = round(microtime(true) * 1000).randomNumber(7)
function randomNumber($length) {
$result = '';
for($i = 0; $i < $length; $i++) {
$result .= mt_rand(0, 9);
}
return $result;
}
答案 0 :(得分:4)
不,MySQL不要求具有自动递增ID列。但是,作为noted in the manual,索引键对于良好的数据库设计至关重要。如果你手动生成ID而不是使用自动增量,那很好,但要确保用于生成ID 始终的算法生成唯一ID(与您发布的算法不同) )。
答案 1 :(得分:2)
是否存在使用自动递增数字的技术原因?
Auto Increment
ID也称为synthetic key columns
,由系统自动生成,并确保它们是唯一的。将自动ID设为primary key
并非强制要求。您可以使用自己的键值将列定义为主键,除非它们确保是唯一的。
对于每一行,我需要一个特定长度的唯一ID,其中包含15个字符 这种情况。
在这种情况下,请不要将其定义为AUTO INCREMENT
并将其设为VARCHAR(15)
列,例如,如果要从应用程序填充数据并说例如它是{{1}在应用程序中,您可以使用.NET/C#
作为主键(或其他一些关键字)。
答案 2 :(得分:0)
您的表格中无需自动增加ID。您可以使用您创建的ID作为主键。至于你的GUID
功能:我相信你知道,不能保证数字不同,只是一个非常好的机会。如果要使用它,则应添加一个检查以查看数据库中是否存在该数字
答案 3 :(得分:0)
通常,数据库中的每个表都应该有一个主键。它可以是自动递增的id列,也可以是数据中自然出现的唯一标识符,或者是生成唯一标识符的其他方法(如guid)
MySQL根本不需要主键,但省略一个通常是非常坏主意。