sql - 如何创建在日期更改时更新的 SQL 表

标签 sql postgresql

目前,我正在创建一个基本上可以创建便利贴的应用程序。我正在为它制作我的 SQL 表。我想要做的是让它可以按日期搜索表格数据。显然一天可以发多个帖子。所以我把日期放到一个单独的表中。我想知道是否有可能使日期表上的日期列不是当前日期,它将自动递增 Id 并使用当前日期创建一个新列

CREATE TABLE IF NOT EXISTS ideas (
id SERIAL PRIMARY KEY,
ideas text, 
date_id int    );


CREATE TABLE IF NOT EXISTS date (
id SERIAL PRIMARY KEY,
table_date CONVERT(VARCHAR(15), GETDATE(),10));

到目前为止,我的代码是否有任何建议,欢迎提出所有建议!

最佳答案

我建议使用 TRIGGER 程序。每次在 ideas 表上进行插入时,您都可以触发一个函数。此函数可以检查 dates 表并确保其中存在当前日期。它甚至可以在 ideas 表的 date_id 列中设置该日期的新 ID。

例如:

DROP TABLE IF EXISTS ideas;
CREATE TABLE ideas (
  id SERIAL PRIMARY KEY,
  ideas text, 
  date_id int
);

-- "date" is a reserved word. try to avoid naming a table "date".
DROP TABLE IF EXISTS dates;
CREATE TABLE  dates (
  id SERIAL PRIMARY KEY,
  table_date DATE DEFAULT NOW() -- i would recommend the DATE type here
);

DROP TRIGGER IF EXISTS insert_date_if_absent ON ideas;
DROP FUNCTION IF EXISTS insert_date_if_absent();

CREATE FUNCTION insert_date_if_absent()
RETURNS TRIGGER
AS $$
DECLARE
  today date := now();
  new_date_id integer;
BEGIN
  IF NOT EXISTS (SELECT * FROM dates WHERE table_date = today) THEN
    INSERT INTO dates (table_date) VALUES (today) RETURNING id INTO new_date_id;
  ELSE
    SELECT id FROM dates WHERE table_date = today INTO new_date_id;
  END IF;
  IF NEW.date_id IS NULL THEN
    NEW.date_id := new_date_id;
  END IF;
  RETURN NEW;
END
$$ LANGUAGE PLPGSQL;

CREATE TRIGGER insert_date_if_absent
    BEFORE INSERT ON ideas
    FOR EACH ROW
    EXECUTE PROCEDURE insert_date_if_absent();

这将允许您在插入 ideas 时省略 date_id。如果省略,触发器会自动将其设置为今天日期的 ID。

INSERT INTO ideas (ideas) VALUES ('sup dudeee');

我在回答中加入的一些其他反馈:

  • 不要将日期存储为 VARCHAR,这样效率低而且麻烦。请改用 DATE
  • 不要用 Postgres 中的保留字命名表。不要将 date 命名为 dates

关于sql - 如何创建在日期更改时更新的 SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43059559/

相关文章:

mysql - 如果一行未通过过滤器,则可以忽略结果组

mysql - 如果列返回空结果,请检查 MySQL 中的另一列

sql - 从连接表中选择两个条目 (1 :m)

sql - Postgres 默认值是两条记录的差值

postgresql - postgresql 9.2 中的 pg_test_fsync contrib 模块是否已弃用?

Perl 死于 : "Usage: DBD::Pg::db::DESTROY(dbh) during global destruction"

sql - 数据库索引及其 Big-O 表示法

sql - 如果同时购买了两件商品,请选择 orderId

带有插入选择和用户变量的 MySQL 存储过程

linux - 从命令行导入 PostgreSQL CSV