MYSQL QUERY检索数据

时间:2012-02-01 16:36:07

标签: php mysql database oracle

我有以下架构,其中包含以下属性:

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

我基本上有两个问题:

  1. 如何将属性USER_ID设为主键,应该如此 每次插入值时自动递增值 数据库。它不应该在我的控制之下。

  2. 如何根据最新信息从数据库中检索记录     更新时间(例如,如果我更新了记录     下午2点和下午3点相同的记录,如果我现在在下午4点取回,我应该得到     在下午3点更新的记录,即最新更新的记录。)

  3. 请帮忙。

5 个答案:

答案 0 :(得分:2)

我假设问题一是在MYSQL的上下文中。因此,您可以使用ALTER TABLE语句将字段标记为PRIMARY KEY,并将其标记为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 :(得分:1)

我假设您在谈论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;

关于你的第二个问题,我不确定我理解。如果您更新一行然后提交该更改,则所有后续查询都将读取更新的数据(除非您设置了可序列化的事务隔离级别并且您已经运行了多个小时的事务,并且您'在该事务中重新运行查询)。您无需执行任何操作即可查看当前数据。

答案 2 :(得分:1)

(基于MySQL的答案;如果使用Oracle,概念上类似的答案,但SQL可能会有所不同。)

  1. 如果USER_ID未定义为主键或在创建表时自动递增,则可以使用:

    ALTER TABLE tablename MODIFY USER_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

  2. 要根据记录日期发出查询,您必须定义一个字段以容纳date-related datetypes。记录修改的日期和时间将根据您访问记录的方式管理(例如添加/更改)(与PHP相关的一些方式?根据您的问题,您不清楚您在玩什么脚本。)在您的记录中有日期后,您可以在ORDER BY查询中SELECT日期字段。

答案 3 :(得分:0)

  1. 您可以使用以下内容:

    CREATE TABLE IF NOT NOT EXISTS userUSER_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 DEFAULT 0, flag2 smallint(1)NOT NULL DEFAULT 0, update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 主要关键(uid) )ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1;

  2. 供选择使用查询:

    SELECT * from user ORDER BY update_time DESC

答案 4 :(得分:0)

  1. 检查一下 对于您的AUTOINCREMENT,Its a question already asked here
    对于您的PRIMARY KEY使用此 ALTER TABLE USER ADD PRIMARY KEY (USER_ID)

  2. 您能提供更多信息吗?如果值得到更新,您绝对不会在dB中输入您在下午2点输入的旧值。所以查询它会没问题