SQL auto_increment非int-only值

时间:2016-12-15 20:49:54

标签: mysql

我正在研究auto_increment,我想自动生成唯一的id主键。问题是我只知道如何使用数字ID。据我所知,主键必须是唯一的。所以我不能为多个表使用数字auto_increment,因为id不是唯一的。我现在就是这样做的:

CREATE TABLE students (
id int(3) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name char(20),
lastname char(20)
);

据我所知,这将生成ID,如:1,2,3,4,除非我命名一个不同的起始编号。是否可以自动增加“stud_1”或“stud_01”之类的东西然后继续增加数量?到目前为止,我还没有遇到过这样的例子。

2 个答案:

答案 0 :(得分:1)

我在上面的评论中写了很多,但是让我把它应用到答案中的实际应用中。我们将从您的表开始,然后再添加两个:

<强>表格

CREATE TABLE students (
    id int(3) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name char(20),
    lastname char(20)
) ENGINE = INNODB;

CREATE TABLE subjects (
    id int(3) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name char(20)
) ENGINE = INNODB;

CREATE TABLE student_subject (
    student_id int(3) NOT NULL,
    subject_id int(3) NOT NULL,
    PRIMARY KEY(student_id, subject_id)
    FOREIGN KEY(student_id) references students(id),
    FOREIGN KEY(subject_id) references subjects(id)
) ENGINE = INNODB;

通过设置这样的表,可以在同一个数据库中拥有多个数字auto_increment主键列。在这种情况下,有两个students.idsubjects.id。第三个表student_subject显示了如何将这些链接在一起,其中student_idsubject_id都是该表的主键,但每个表都是其实体表的外键。

使用这样的设置查询变得简单:

示例查询:

/* Get All students */
SELECT
students.id,
students.name,
students.lastname
FROM students;

/* Get All Subjects */
SELECT
subjects.id,
subjects.name
FROM subjects;

/* Get all subjects for a particular student */
SELECT
subjects.name
FROM subjects
INNER JOIN student_subject ON subjects.id = student_subject.subject_id
INNER JOIN students ON student_subject.student_id = students.id
WHERE students.id = 1;

修改

下面是一些示例数据,演示了上述结构说明的三表多对多概念:

/* Students Table */
+----+----------------+----------------+
| id | name           | lastname       |
+----+----------------+----------------+
|  1 | John           | Doe            |
|----|----------------|----------------|
|  2 | Joe            | Bob            |
+----+----------------+----------------+

/* Subjects Table */
+----+----------------+
| id | name           |
+----+----------------+
|  1 | Calculus       |
|----|----------------|
|  2 | Physics        |
|----|----------------|
|  3 | Geography      |
+----+----------------+

/* Student Subject Table */
+------------+------------+
| student_id | subject_id |
+------------+------------+
|          1 |          1 |
|------------|------------|
|          1 |          2 |
|------------|------------|
|          2 |          2 |
|------------|------------|
|          2 |          3 |
+------------+------------+

通过这种表格结构,每个学生可以拥有多个科目,每个科目都可以属于许多学生。例如,John Doe(学生1)参加了微积分(科目1)和物理科目(科目2)。 Joe Bob(学生2)就读于地理学(学科3)和物理学(学科2)和John Doe。

在这个例子中,每个学生都注册了两个科目,两个学生都注册了一个科目。通过您从 w3schools.com 链接的示例,这种多对多关系是不可能的。

答案 1 :(得分:0)

主键值只需要在表格中唯一,因此您无法为每个表格使用简单的自动增量数字ID。

就问题而言 - 我不相信有直接的方法可以自动增加&#34;您描述的方式中的字符串值。如果你真的想要,可以用触发器和序列(或常规自动增量列)设置一些东西。