【问题标题】:MYSQL QUERY to retrieve the dataMYSQL QUERY 检索数据
【发布时间】:2012-02-01 16:36:07
【问题描述】:

我有以下具有以下属性的架构:

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

我基本上有两个问题:

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

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

请帮忙。

【问题讨论】:

  • 您使用的是哪个数据库? Mysql 还是 Oracle?

标签: php mysql database oracle


【解决方案1】:

我假设问题一是在 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 的新值并希望检索最新的值,那么您将需要使用表中的字段来存储每条记录创建时间的时间戳/更新。然后可以根据时间戳查询最近的值。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      1. 如果USER_ID在创建表时没有定义为主键或自动递增,那么你可以使用:

        ALTER TABLE 表名 MODIFY USER_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

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

      【讨论】:

        【解决方案4】:
        1. 看看这个 对于您的自动增量,Its a question already asked here
          对于您的 PRIMARY KEY 使用此 ALTER TABLE USER ADD PRIMARY KEY (USER_ID)

        2. 您能否提供更多信息。如果该值得到更新,那么您在下午 2 点输入的旧值肯定不会出现在 dB 中。所以查询就可以了

        【讨论】:

          【解决方案5】:
          1. 你可以这样使用:

            如果不存在则创建表user ( USER_ID unsigned int(8) NOT NULL AUTO_INCREMENT, username varchar(25) 非空, password varchar(25) 非空, topic_name varchar(100) 非空, 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 默认字符集=utf8 AUTO_INCREMENT=1 ;

          2. 供选择使用查询:

            SELECT * from user ORDER BY update_time DESC

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-27
            • 2012-04-07
            相关资源
            最近更新 更多