MYSQL QUERY для получения данных - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть следующая схема со следующими атрибутами:

USER(TABLE_NAME)
USER_ID|USERNAME|PASSWORD|TOPIC_NAME|FLAG1|FLAG2

У меня есть два вопроса в основном:

  1. Как сделать атрибут USER_ID в качестве первичного ключаи оно должно автоматически увеличивать значение каждый раз, когда я вставляю значение в базу данных. Оно не должно находиться под моим контролем.

  2. Как получить запись из базы данных на основесамое позднее время, с которого она была обновлена ​​(например, если я обновил запись в 2 часа дня и ту же запись в 3 часа дня, если я получу ее сейчас в 4 часа дня, я должен получить запись, которая была обновлена ​​в 3 часа дня, то есть самое последнее обновление).

Пожалуйста, помогите.

Ответы [ 5 ]

2 голосов
/ 01 февраля 2012

Я предполагаю, что первый вопрос находится в контексте MYSQL. Таким образом, вы можете использовать оператор ALTER TABLE, чтобы пометить поле как ПЕРВИЧНЫЙ КЛЮЧ и пометить его AUTOINCREMENT

ALTER TABLE User
   ADD PRIMARY KEY (USER_ID);

ALTER TABLE User
   MODIFY COLUMN USER_ID INT(4) AUTO_INCREMENT;   -- of course, set the type appropriately

Что касается второго вопроса, я не уверен, что правильно понимаю, поэтому я просто собираюсь дать вам некоторую основную информацию, прежде чем дать ответ, который может сбить вас с толку.

Когда вы обновляете одну и ту же запись несколько раз, сохраняется только самое последнее обновление. Как правило, после обновления записи ее предыдущие значения не сохраняются. Таким образом, если вы обновите запись в 2 часа дня, а затем обновите эту же запись в 3 часа дня - при запросе записи вы автоматически получите самые последние значения.

Теперь, если при обновлении вы имеете в виду, что вы будете вставлять новые значения для одного и того же USER_ID несколько раз и хотите получать самые последние, вам нужно будет использовать поле в таблице для хранения метки времени создания каждой записи. / обновлено. Затем вы можете запросить самое последнее значение на основе отметки времени.

1 голос
/ 01 февраля 2012

(Ответ основан на MySQL; концептуально аналогичный ответ при использовании Oracle, но SQL, вероятно, будет другим.)

  1. Если USER_ID не был определен как первичный ключ или автоматическиувеличивая во время создания таблицы, вы можете использовать:

    ALTER TABLE имя таблицы MODIFY USER_ID INT NOT NULL ПЕРВИЧНЫЙ КЛЮЧ AUTO_INCREMENT;

  2. Для выдачи запросов на основе дат записи, у вас должно быть определено поле для хранения типов дат, связанных с датой .Дата и время изменения записей будет зависеть от того, каким образом вы будете управлять (например, добавлять / изменять) в зависимости от способа доступа к ним (каким-то образом, связанным с PHP). Непонятно, какие скрипты у вас в игре, в зависимости от вашего вопроса..) Если у вас есть даты в ваших записях, вы можете ORDER BY поле даты в вашем SELECT запросе.

1 голос
/ 01 февраля 2012

Я предполагаю, что вы говорите об Oracle, поскольку вы пометили его как Oracle.Вы также пометили вопрос как MySQL, где подход будет другим.

Вы можете сделать столбец USER_ID первичным ключом

ALTER TABLE <<table_name>>
  ADD CONSTRAINT pk_user_id PRIMARY KEY( user_id );

Если вы хотите, чтобы значение увеличивалось автоматически, вынужно создать последовательность

CREATE SEQUENCE user_id_seq
  START WITH 1
  INCREMENT BY 1
  CACHE 20;

, а затем создать триггер на таблице, которая использует последовательность

CREATE OR REPLACE TRIGGER trg_assign_user_id
  BEFORE INSERT ON <<table name>>
  FOR EACH ROW
BEGIN
  :new.user_id := user_id_seq.nextval;
END;

Что касается вашего второго вопроса, я не уверен, что яПонимаю.Если вы обновите строку, а затем подтвердите это изменение, все последующие запросы будут считывать обновленные данные (за исключением исключительно маловероятных случаев, когда вы установили сериализуемый уровень изоляции транзакции и у вас есть транзакции, которые выполняются в течение нескольких часов, и вы ''выполняется запрос в этой транзакции).Вам не нужно ничего делать, чтобы увидеть текущие данные.

0 голосов
/ 01 февраля 2012
  1. Проверьте это. Для вашего AUTOINCREMENT, Это уже заданный вопрос здесь
    Для вашего ПЕРВИЧНОГО КЛЮЧА используйте это ALTER TABLE USER ADD PRIMARY KEY (USER_ID)

  2. Можете ли вы предоставить больше информации.Если значение обновляется, у вас определенно НЕ будет вашего старого значения, которое вы ввели в 2 часа дня, присутствующего в дБ.Так что запросить его будет хорошо

0 голосов
/ 01 февраля 2012
  1. Вы можете использовать что-то вроде этого:

    СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ user ( USER_ID unsigned int (8) NOT NULL AUTO_INCREMENT, username varchar (25) NOT NULL, password varchar (25) NOT NULL, topic_name varchar (100) NOT NULL, flag1 smallint (1) NOT NULL ПО УМОЛЧАНИЮ 0, flag2 smallint (1) NOT NULL ПО УМОЛЧАНИЮ 0, update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, ПЕРВИЧНЫЙ КЛЮЧ (uid) ) ENGINE = InnoDB CHARSET ПО УМОЛЧАНИЮ = utf8 AUTO_INCREMENT = 1;

  2. Для выбора используйте запрос:

    ВЫБРАТЬ * из user ЗАКАЗАТЬ ПО update_time DESC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...