使用的SQL Server = MySQL
编程语言=无关紧要,但我坚持使用Java和C#
我有一个理论问题,关于SQL数据库的主键生成的最佳方法,然后由我编写的另一个程序使用(假设它不是基于Web的。)
我知道主键必须是唯一的,我更喜欢主键,我可以在看到它们时立即告诉它们来自哪里,当我使用数据库时,在我的eclipse或windows控制台中,以及在关系表中。出于这个原因,我通常创建自己的主键作为字母数字字符串,除非有特定的唯一值,如ISBN或SS num。对于表Actors,主键可以看起来像a1,并且在表中电影m1020(假设标题不是唯一的,例如电影的不同版本'Return to witch Mountain')。
那么我的问题是,如何最好地生成主键(在我的程序中或在数据库本身作为一个过程)?对于这样的方案,最好使用两列,一列是常量字符串,例如演员的'a'和一个运行计数? (在这种情况下,我需要研究如何引用一个PK跨越多列的表)处理这样一个任务的最专业的方法是什么?
感谢您的时间。
答案 0 :(得分:1)
最佳做法是让您的数据库引擎生成主键auto-increment
NUMBER。字母数字字符串不是一个好方法,即使它看起来太“抽象”了。然后,您不必担心程序中的主键(Java,C#,其他任何东西);在数据库中插入的每一行中,都会自动插入一个唯一的主键
顺便说一句,使用您的解决方案,我不确定您是否管理同时插入两行的情况......您确定绝对不会重复您的主键吗?
答案 1 :(得分:1)
你的第一行说: -
SQL Server = MySQL
这不是真的。他们是不同的。
如何最好地生成主键(在我的程序中或在db本身中) 作为程序)?
当您指定具有主键约束的列时,主键由MYSQL生成。主键自动生成,并自动递增。
如果您希望主键为字母数字(我个人不推荐),那么您可以尝试这样: -
CREATE TABLE A(
id INT NOT NULL AUTO_INCREMENT,
prefix CHAR(30) NOT NULL,
PRIMARY KEY (id, prefix),
我建议您将主键设置为整数,这样可以帮助您更轻松,更优化。对于MyIsam表,您可以创建多列索引并将auto_increment字段放在辅助列上
答案 2 :(得分:0)
对于MySQL,有一种最好的方法 - 为主键表字段设置AUTO_INCREMENT属性。 您可以稍后使用last_insert_id函数获取生成的id,或者使用java或c#analog。
答案 3 :(得分:0)
我不知道为什么你会使用“字母数字”值 - 为什么不只是一个简单的数字呢?
无论如何,使用您使用的任何DB系统中可用的任何自动增量功能,并坚持使用。 不在数据库之外创建主键 - 您无法知道两个系统何时/如何同时访问数据库,如果两个系统创建相同的PK值,可能会导致问题,以及试图插入它。
此外,在我看来,PK应该只是特定行的ID(在单个列中),而不是更多 - 如果您需要一个字段来指示记录涉及类型“actor”的数据,例如,那应该是一个单独的字段,与主键无关(为什么会这样?)