Intereting Posts
mySQL-запрос – показать самый популярный элемент Получить первое значение строки, разделенной запятыми Пользовательские сеансы с Joomla Как лучше обрабатывать исключения в конструкторе? Сохраненные неанглийские символы, получившие '?????' – Ошибка набора символов MySQL Является ли создание массива в каждом цикле foreach? Поиск значения в столбце BLOB в MySQL Каков наилучший способ взглянуть на экземпляр (объект) класса PHP, чтобы увидеть все доступные ему публичные свойства и методы? ZF2: пользовательский картографический модуль для модуля ZfcUser Получение timestamp unix в миллисекундах в PHP5 и ActionScript3 Как скрыть URL от пользователей при отправке этой формы? Удалять каждый второй элемент из массива и ключей перегруппировки? Laravel 4 Создатель форм Пользовательские поля Макро Отправлять данные в базу данных при нажатии ссылки без обновления страницы. Несколько версий PHP в Wamp под Windows 7

Автоматическое добавление MySQL между таблицами

В 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 в подтипах не будет присутствовать в обоих.

Вот упрощенный пример того, как вы можете это сделать:

Модель ER

Эта модель позволит вам поддерживать взаимосвязь между категориями и темами, но при этом оба сущностей обобщаются в таблице 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; //