如何创建不重复的身份证号码

Posted

技术标签:

【中文标题】如何创建不重复的身份证号码【英文标题】:How to create ID number without duplication 【发布时间】:2020-11-23 16:12:52 【问题描述】:

我有一个名为 Student 的表,其中包含以下列:

First name 
Last name
Class ID
Class 

我想为学生创建一个 ID,我尝试使用 Row_number Over Partiton,但我似乎没有得到想要的东西,但更多的是自行重置,这是我想要得到的结果。

First Last   Class    ClasID  ID (outcome looking for)
------------------------------------
John  Brown  Math     M21     ID01
John  Brown  English  E31     ID01
Tom   Bank   Math     M21     ID02
John  Brown  Gym      G41     ID01
Tim   Brown  English  E31     ID03

【问题讨论】:

首先不应该将该表称为Student。应该有三个表:Student(每个学生一行,每个学生的个人数据,包括一个student_id),Class(每个班级一行,每个班级的特征,包括一个class_id) ,还有一张像你说明的那样的表格,可能称为Student_Class,仅列出(student_id, class_id) 的对,以显示每个学生注册的课程。所以,问题:这是你想出的吗?这是你班上的作业吗? 如果是作业,我会告诉老师这不是一个好的数据模型,不应该鼓励我们学习糟糕的数据模型。如果这是您想出的,您可能需要重新考虑您的方法。 【参考方案1】:

使用dense_rank():

select t.*, dense_rank() over(order by last, first) as id
from student

这会将相同的id 分配给名字和姓氏相同的行。

如果你真的想要像IDnn 这样的格式(在我看来这没有多大意义),那么你可以格式化和连接:

select t.*, 
    'ID' || to_char(dense_rank() over(order by last, first), '09') as id
from student

如果有超过 99 个不同的学生,这将无法生成正确的字符串。

【讨论】:

【参考方案2】:

@GMB 提供的 dense_rank 解决方案会生成一个“id”作为给定结果集的一部分,而不是作为给定学生的固有标识符。将 ID 永久分配给实体(学生、员工、班级等)的经典方法是创建一个 SEQUENCE,然后创建一个 on_insert TRIGGER 以使用序列的 next_value 填充 ID 列。

SQL> CREATE TABLE STUDENTS
  2  (
  3    STUDENT_ID NUMBER NOT NULL
  4  , FIRST_NAME VARCHAR2(20)
  5  , LAST_NAME VARCHAR2(20)
  6  , CONSTRAINT STUDENTS_PK PRIMARY KEY
  7    (
  8      STUDENT_ID
  9    )
 10    ENABLE
 11  );

Table created.

Elapsed: 00:00:00.05
SQL> --
SQL> CREATE SEQUENCE id_seq
  2   START WITH     1
  3   INCREMENT BY   1
  4  ;

Sequence created.

Elapsed: 00:00:00.01
SQL> CREATE OR REPLACE TRIGGER STUDENTS_TRIG
  2  BEFORE INSERT ON students
  3  FOR EACH ROW
  4  BEGIN
  5    :new.student_ID := ID_SEQ.NEXTVAL;
  6  END;
  7  /

Trigger created.

Elapsed: 00:00:00.02

SQL> show errors
No errors.
SQL> --
SQL> insert into students (first_name,
  2                        last_name)
  3              values ('Ed',
  4                      'Stevens'
  5                     )
  6  ;

1 row created.

Elapsed: 00:00:00.18
SQL> commit;

Commit complete.

Elapsed: 00:00:00.01
SQL> select * from students;

STUDENT_ID FIRST_NAME           LAST_NAME
---------- -------------------- --------------------
         1 Ed                   Stevens

1 row selected.

Elapsed: 00:00:00.07
SQL> --
SQL> drop trigger students_trig;

Trigger dropped.

Elapsed: 00:00:00.02
SQL> drop table students purge;

Table dropped.

Elapsed: 00:00:00.05
SQL> drop sequence id_seq;

Sequence dropped.

Elapsed: 00:00:00.01

从版本 12 开始,您不必创建序列或触发器,只需将 ID 列声明为“身份”列。我把它留给学生研究这个概念的练习。

【讨论】:

以上是关于如何创建不重复的身份证号码的主要内容,如果未能解决你的问题,请参考以下文章

两张excel表格如何找出相同的身份证号码?【急】

如何创建唯一索引

怎么检测身份证号码是不是正确

sql 2005 语句 身份号码不重复

身份证号如何提取信息?

如何在 Spring-Boot 项目中为电话号码身份验证创建 REST API?