作者dinos (Guardian Angel)
看板PHP
标题Re: [问题] 有关MySQL中auto_increment的问题
时间Sun Dec 18 11:22:17 2005
※ 引述《sedc (半个圣诞夜)》之铭言:
: ※ [本文转录自 Web_Design 看板]
: 作者: sedc (半个圣诞夜) 看板: Web_Design
: 标题: [问题] 有关MySQL中auto_increment的问题
: 时间: Fri Dec 16 15:07:46 2005
: 假设现在有二个table
: Item
: (
: ItemID int auto_increment primary key,
: blahblah............
: );
: QA
: (
: ItemID int,
: QAID int auto_increment,
: primary key (ItemID,QAID)
: QAothers ......
: );
: 简单地说呢,每一个ITEM都会有数个QA,而QA也是跟着Item存在的,所以
: 我想让QA的ItemID跟Item的ItemID做reference,也就是把ItemID弄成foreign key
: 用法我知道是 加上foreign key及 references Item(ItemID),但现在有个问题
: 是因为在QA中,必须要由ItemID及QAID共同组成primary key,而我又希望属於同一个
: ItemID的QAID可以自动做increment,也就是说
: 第一笔资料 第二笔资料
: ItemID 1 ItemID 1
: QAID 1 QAID 2
: 若今天我要输入第三笔资料,他的ItemID是2,那有没有办法让mysql自动把它的QAID降
: 回1,而不是3呢?
: (如果照我上面的指令打的话,会出现「使用auto_increment的栏位必须被指定为key」
: 的错误讯息, 但若在QAID加上了key,又会出现「多个primary key」的错误)
: 还是只能自己用网页的程式部份来判断了呢? 谢谢~
如果你的 ItemID 跟 QaID 的对应是固定的,比如每两(n)个 QaID 就 ItemID 加一
ItemID QaID Pky=(ItemID*2+QaID-2)=(ItemID*n+QAID-n)
1 1 1
1 2 2
2 1 3
2 2 4
3 1 5
3 2 6
4 1 7
等等等.....
所以 ItemID = (Pky+2-QaID)/2 = floor((Pky-1)/2)+1 = floor((Pky-n)/n)+1
QaID = (Pky+2-ItemID*2) = 2-(Pky+2)%2 = n-(Pky+n)%n
在 MySQL 里就不要 ItemID 和 QaID,改成以 Pky 代替
如:
Pky bigint(20) unsigned not null auto_increment PRIMARY
QAother ......................
mysql_query 用
SELECT Pky, (FLOOR((Pky-1)/2)+1) as ItemID, (2-MOD(Pky+2,2)) as QaID FROM ....
=>
SELECT Pky, (FLOOR((Pky-1)/n)+1) as ItemID, (n-MOD(Pky+n,n)) as QaID FROM ....
就可以得到 ItemID 和 QaID
而且,只要确保 Pky 是自动递增,那 ItemID 和 QaID 也会是自动递增
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.158.10