MySQL在表之间自动递增

时间:2012-07-28 18:05:39

标签: php mysql sql

在MySQL中,是否可以在两个不同的表中自动增加一列?示例:table1有一列'secondaryid',table2也有一列'secondaryid'。是否可以让table1.secondaryid和table2.secondaryid保持相同的信息?像table1.secondaryid可以保存值1,2,4,6,7,8等,table2.secondaryid可以保存值3,5,9,10?其原因有两个:1)两个表将在“喜欢”的单独表中引用(类似于喜欢Facebook页面的用户)和2)表2中的数据是使用主键的table1的子集。所以表2中的信息依赖于table1,因为它们是不同类别的主题。 (类别为table1,主题为table2)。是否有可能做上面描述的事情,或者是否有一些我不知道的其他结构性工作?

7 个答案:

答案 0 :(得分:5)

您似乎想要在两个单独的表中区分类别和主题,但是要在另一个表likes中引用它们的ID,以方便用户喜欢类别或主题。

您可以做的是创建一个包含子类型categoriestopics的超实体表。自动递增的密钥将在超实体表中生成,并仅插入到两个子类型表中的一个中(基于它是类别还是主题)。

子类型表通过自动递增的字段以1:1的关系引用此超级实体。

这样,您只需基于一列(可以表示类别或主题)将超实体表链接到likes表,并且子类型中没有id表格将出现在两者中。

以下是如何对此进行建模的简化示例:

ER Model

此模型允许您维护类别和主题之间的关系,但在superentity表中概括了两个实体。

此模型的另一个优点是您可以将子类型表中的常用字段抽象为superentity表。例如,categoriestopics都包含字段titleurl:您可以将这些字段放在superentity表中,因为它们是{{1}}表的常见属性它的亚型。只将特定于子类型表的字段放入子类型表中。

答案 1 :(得分:4)

您不能在表之间共享auto_increment值,但可以使其显示为:

set @@auto_increment_increment=2; // change autoinrement to increase by 2

create table evens (
    id int auto_increment primary key
);
alter table evens auto_increment = 0;

create table odds (
    id int auto_increment primary key
);
alter table odds auto_increment = 1;

这样做的缺点是您正在更改全局设置,因此所有 auto_inc字段现在将增长2而不是1。

答案 2 :(得分:3)

如果您只想让两个表中的ID不同,您最初可以将table2的AUTO_INCREMENT设置为某个大数字。

ALTER TABLE `table2` AUTO_INCREMENT=1000000000;

答案 3 :(得分:1)

听起来你想要一个MySQL等价的序列,可以在DBMS中找到像PosgreSQL。有一些已知的配方,其中大部分涉及创建跟踪序列名称的表和保持当前值的整数字段。此方法允许您查询包含序列的表,并在必要时在一个或多个表上使用该表。

There's a post here对这个问题有一个有趣的方法。我也看到DB PEAR module中使用的这种方法已经过时了。

答案 4 :(得分:0)

您需要通过客户端或mysql内部的sql函数手动设置其他表的增量值:

ALTER TABLE users AUTO_INCREMENT = 3

因此,在插入table1之后,您将返回上一个自动增量,然后修改另一个表的自动增量字段。

答案 5 :(得分:0)

您可以使用触发器执行此操作:

-- see http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);

CREATE TABLE table1 (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    secondardid INT UNSIGNED NOT NULL DEFAULT 0,
    PRIMARY KEY (id)
);

CREATE TABLE table2 (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    secondardid INT UNSIGNED NOT NULL DEFAULT 0,
    PRIMARY KEY (id)
);

DROP TRIGGER IF EXISTS table1_before_insert;
DROP TRIGGER IF EXISTS table2_before_insert;

DELIMITER //

CREATE
TRIGGER table1_before_insert
    BEFORE INSERT ON 
        table1
    FOR EACH ROW
BEGIN
    UPDATE sequence SET id=LAST_INSERT_ID(id+1);
    NEW.secondardid = LAST_INSERT_ID();
END;
//

CREATE
TRIGGER table2_before_insert
    BEFORE INSERT ON 
        table2
    FOR EACH ROW
BEGIN
    UPDATE sequence SET id=LAST_INSERT_ID(id+1);
    NEW.secondardid = LAST_INSERT_ID();
END;
//

答案 6 :(得分:0)

我对你的问题感到困惑。如果表2是表3的子集,为什么要让它共享主键值。你的意思是在表2和表3之间分类?

如果是这样,我会质疑将它们放入单独的表中的设计选择。听起来你有两种不同的情况之一。首先,你有一个“类别”实体,有两种形式。在这种情况下,您应该有一个类别表,可能带有指定类别类型的类型列。

第二,你的用户可以“喜欢”不同的东西。在这种情况下,“用户喜欢”表应该为每个对象都有一个单独的外键。您可以使用复合外键来获取技巧,其中您具有对象类型和之后的常规数字ID。因此,类似的表将具有“类型”和“id”。人员表的列将填充“PERSON”,另一列填充数字ID。加入会说“on a.type = b.type and a.id = b.id”。 (或者“类型”中的部分可以是隐含的,在表的选择中)。