В MySQL, возможно ли иметь столбец в двух разных таблицах, которые автоматически увеличиваются? Пример: table1 имеет столбец «secondaryid», а table2 также имеет столбец «secondaryid». Возможно ли, чтобы таблица1.secondaryid и table2.secondaryid сохраняли ту же информацию? Подобно table1.secondaryid может содержать значения 1, 2, 4, 6, 7, 8 и т. Д. И таблица2.sondondid может содержать значения 3, 5, 9, 10? Причина этого двоякая: 1) две таблицы будут указаны в отдельной таблице «любит» (аналогично пользователям, которые любят страницу на facebook), и 2) данные в таблице 2 являются поднаборами таблицы1 с использованием первичного ключа. Таким образом, информация, размещенная в таблице 2, зависит от таблицы 1, поскольку они являются темами разных категорий. (категории – таблица1, а темы – таблица2). Можно ли сделать что-то, описанное выше, или есть какая-то другая структурная работа вокруг, о которой я не знаю?
Кажется, что вы хотите различать категории и темы в двух отдельных таблицах, но идентификаторы обоих из них должны быть указаны в другой таблице, чтобы облегчить пользователям симпатию к категории или теме.
Что вы можете сделать, так это создать таблицу супер-сущностей с categories
и topics
подтипов. Ключ с автоинкрементами будет сгенерирован в таблице супер-сущности и вставлен только в одну из двух таблиц подтипов (в зависимости от того, является ли это категорией или темой).
Таблицы подтипов ссылаются на этот супер-объект через поле с автоматическим приращением в соотношении 1: 1.
Таким образом, вы можете просто связать таблицу супер-сущности с таблицей likes
таблиц только на основе одного столбца (который может представлять собой категорию или тему), и ни один id
в подтипах не будет присутствовать в обоих.
Вот упрощенный пример того, как вы можете это сделать:
Эта модель позволит вам поддерживать взаимосвязь между категориями и темами, но при этом оба сущностей обобщаются в таблице superentity
.
Еще одно преимущество этой модели – вы можете абстрагировать общие поля в таблицах подтипов в таблицу судьбы. Скажем, например, что categories
и topics
содержали title
полей и url
: вы можете поместить эти поля в таблицу superentity
потому что они являются общими атрибутами его подтипов. Поместите только поля, которые являются специфическими для подтипов в подтипах.
Вы не можете иметь значение 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.
Если вы просто хотите, чтобы идентификаторы в двух таблицах были разными, вы можете сначала установить AUTO_INCREMENT таблицы2 на некоторое большое число.
ALTER TABLE `table2` AUTO_INCREMENT=1000000000;
Вы должны установить значение инкремента другой таблицы вручную либо клиентом, либо внутри mysql через функцию sql:
ALTER TABLE users AUTO_INCREMENT = 3
Поэтому после вставки в таблицу 1 вы возвращаете последний автоинкремент, а затем изменяете поле автоматического приращения другой таблицы.
Я смущен вашим вопросом. Если таблица 2 является подмножеством таблицы 3, почему вы должны делиться ее значениями первичного ключа. Вы имеете в виду, что категории разделены между таблицей 2 и таблицей 3?
Если это так, я поставил бы под сомнение выбор дизайна, чтобы помещать их в отдельные таблицы. Похоже, у вас одна из двух ситуаций. Во-первых, у вас есть объект категории, который поставляется в двух вариантах. В этом случае вы должны иметь одну таблицу категорий, возможно, с столбцом типа, который указывает тип категории.
Во-вторых, ваши пользователи могут «любить» разные вещи. В этом случае таблица «нравится пользователю» должна иметь отдельный внешний ключ для каждого объекта. Вы можете снять трюк, используя сложный внешний ключ, где у вас есть тип объекта и регулярный числовой идентификатор. Таким образом, подобная таблица будет иметь «тип» и «id». Таблица лиц будет иметь столбец, заполненный «ЧЕЛОВЕК», а другой с числовым идентификатором. И соединение будет указывать «на a.type = b.type и a.id = b.id». (Или часть «типа» может быть неявной, в выборе таблицы).
Похоже, вы хотите эквивалент последовательности MySQL, который можно найти в СУБД, таком как PosgreSQL. Для этого существует несколько известных рецептов, большинство из которых связаны с созданием таблиц (таблиц), которые отслеживают имя последовательности и целое поле, которое сохраняет текущее значение. Этот подход позволяет вам запрашивать таблицу, содержащую последовательность, и использовать ее в одной или нескольких таблицах, если это необходимо.
Здесь есть статья, в которой есть интересный подход к этой проблеме. Я также видел этот подход, используемый в модуле DB PEAR, который теперь устарел.
Вы можете сделать это с помощью триггеров:
-- 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; //