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

时间:2017-03-28 02:19:20

标签: 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));

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

1 个答案:

答案 0 :(得分:0)

我建议使用TRIGGER程序。每次在ideas表上进行插入时,都可以触发函数。此函数可以检查dates表并确保当前日期存在。它甚至可以在date_id表的ideas列中设置该日期的新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();

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

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

我在答案中加入了一些其他反馈:

  • 不要将日期存储为VARCHAR,效率更低,更麻烦。请改用DATE
  • 不要在Postgres中的保留字后命名表格。而不是date,而是将其命名为dates