问一个很简单的问题,mysql数据库怎么设置ID自动递增但不是主键?
我想在数据库中建立两张表student和course,两张表是多对多的关系,用score是它们之间的关系表,score中包括student_id和course_id,把这...
我想在数据库中建立两张表student和course,两张表是多对多的关系,用score是它们之间的关系表,score中包括student_id和course_id,把这两个作为表的联合主键,但是想为每个记录再加一个唯一的id,方便查找,该怎么办呢?数据库中警告不可以设置id自动递增但不是主键。。。。。
展开
2013-07-08
展开全部
如果你要为 score中, 增加一个 唯一的 自增 id。
那么恐怕你要修改表的主键了, 把 那个使用 AUTO_INCREMENT 的 id 设置为主键。
因为 仅仅只定义 AUTO_INCREMENT 是无法处理的。
mysql> CREATE TABLE tab (
-> id INT AUTO_INCREMENT,
-> val VARCHAR(10)
-> );
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
看上上面的例子了么?
我仅仅定义了 id INT AUTO_INCREMENT。
没有定义为主键。
结果错误提示信息为:
只能有一个自动递增的列, 并且必须要定义为 key.
展开全部
可以写一个序列,序列步长为1,再写一个触发器,调用这个序列。
create sequence ID_CODE
minvalue 1
maxvalue 10
start with 1
increment by 1
cache 20;(这个是序列代码)
CREATE OR REPLACE TRIGGER score
BEFORE INSERT ON score
FOR EACH ROW
when (new.id IS NULL)
BEGIN
SELECT id_code.nextval INTO :new.id FROM dual;
END;(触发器,每当向score表中插入数据时,启动触发器,给id附一个序列的号码)
这样不管ID是否是主键,都没关系,麻是麻烦点,但是很实用,逻辑也很清晰。你就顺便学学序列和触发器吧。
create sequence ID_CODE
minvalue 1
maxvalue 10
start with 1
increment by 1
cache 20;(这个是序列代码)
CREATE OR REPLACE TRIGGER score
BEFORE INSERT ON score
FOR EACH ROW
when (new.id IS NULL)
BEGIN
SELECT id_code.nextval INTO :new.id FROM dual;
END;(触发器,每当向score表中插入数据时,启动触发器,给id附一个序列的号码)
这样不管ID是否是主键,都没关系,麻是麻烦点,但是很实用,逻辑也很清晰。你就顺便学学序列和触发器吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用自增长id做主键
然后学生id和课程id分别为非空,两者再定义一个联合的唯一索引。
然后学生id和课程id分别为非空,两者再定义一个联合的唯一索引。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
primapy是主键的意思,表示定义的该列值在表中是唯一的意思,不可以有重复。
auto_increment可以理解为自动递增的意思,每增加一条记录,值会自动加1
如:
create
table
`table
name`
(
`id`
smallint(6)
unsigned
not
null
auto_increment,
`name`
varchar(16)
not
null
default
'',
primary
key
(`id`)
)
engine=myisam
default
charset=latin1
如果你insert
into
tablename
(id,name)
values
('','sadfa');
那么尖的值就是1
如果你再次insert
into
那这时你的id
的值班将会是2!
auto_increment可以理解为自动递增的意思,每增加一条记录,值会自动加1
如:
create
table
`table
name`
(
`id`
smallint(6)
unsigned
not
null
auto_increment,
`name`
varchar(16)
not
null
default
'',
primary
key
(`id`)
)
engine=myisam
default
charset=latin1
如果你insert
into
tablename
(id,name)
values
('','sadfa');
那么尖的值就是1
如果你再次insert
into
那这时你的id
的值班将会是2!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询