目前,我正在创建一个基本上可以创建便利贴的应用程序。我正在为它制作我的 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/