【问题标题】:Create a table with student ID starting with a letter - mysql创建一个学生ID以字母开头的表 - mysql
【发布时间】:2012-08-29 01:45:34
【问题描述】:

我需要为 ID 以 M 或 I 开头并后跟 7 位数字的学生创建一个表格。我考虑过创建一个表,其中一个字段选择字母 M 或 I,第二个字段是 7 位数字。然后我会用它们来创建一个复合主键。但我认为这不是我要找的。我想要一栏作为学生证。

这是我目前所拥有的:

   create table student(    
       student_id_first ENUM('M', 'I')  
       , student_id_digits  char(8) not null    unique  
       , first_name varchar(50)
       , last_name   varchar(50)    
       , Primary Key(student_id_first, student_id_digits)   
    )   ;

想法?

谢谢。

【问题讨论】:

  • 为什么不在你的应用程序级别做呢?数据库用作数据的存储。
  • ID 中有 M 或 I 的原因是遗留代码的原因吗?如果没有,请问您为什么要这样做?如果是为了表明学生的某些事情,我个人不会那样使用主键。
  • @Marvo,我这样做是为了做作业。这是分配的。
  • 我建议谷歌搜索“mysql 检查约束”。

标签: mysql primary-key composite-key


【解决方案1】:

您不应该将数据验证放在数据库层中。您还创建了一个复合键,它增加了额外的、不必要的开销。如果在某些时候需要调整或放松规则,则需要重新定义数据库架构。

这也会在检索数据和组装实际学生标识符时引入毫无意义的复杂性。除非您有充分的理由将它们分开,否则请将它们放在一起。

只需使用一列并强制执行应用程序中的内容。即使是一个非常基本的 ORM 也会让你能够做到这一点。

【讨论】:

  • 我明白你在说什么。但如果是为了家庭作业,我不能放松规则。 ://
  • 您可以在 MySQL 中强制执行的唯一真正约束是数据类型(如果允许 NULL)或值的长度。由于不支持 CHECK 约束,因此您可能在此分配中使用了错误的 RDBMS,除非使用 TRIGGER 有某种(可能令人不寒而栗)方法来执行此操作。
【解决方案2】:

这里最简单的方法是定义一个字段id char(8) 并将其设为主键。

打开的问题(您的老师可能会问的问题)是“如果某些流氓软件客户端插入不符合您的业务规则的 'K1234567'、'DEADBEEF' 或 'I123' 之类的 ID 会发生什么情况对于 id 值?”

这个问题你可以给你的老师的可能有效的答案是:

  1. 如果我们在生产中,我们会测试软件客户端以防止这种情况发生。
  2. 我们可以运行日常生产清除流程来清除 ID 编号格式错误的行。
  3. 你到底想要什么?这是两个学分课程的一周作业!我已经为您提供了一个与大多数工资系统一样好的架构!

说真的,从您最初的问题来看,您的老师并没有坚持让您设计一个执行此特定业务规则的 dbms 架构。但只有你自己知道是不是这样。

【讨论】:

  • 哈!我给了她答复,“我们为什么需要那封信?”她说,“因为我是这么说的。”
  • 很公平。与需求争论通常是没有意义的。如果您正在为大学图书馆创建软件,并且您说“国会图书馆 (LOC) 目录编号太难了;让我们将图书馆切换到杜威十进制系统”,图书馆馆长会笑然后解雇您。因此,您必须实现指定的数字系统(带有字母)。问题是您是否可以简单地将每个 ID 值存储在文本字符串中,或​​者您是否必须使用字符和整数。我说,使用文本字符串!这更容易!它也适用于 LOC 目录号。
猜你喜欢
  • 2015-01-12
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
相关资源
最近更新 更多