安裝
```=
# 更新套件庫
sudo apt update -y
```
```=
# 安裝 PostgreSQL
sudo apt install postgresql postgresql-contrib
```
```=
# 查看 PostgreSQL 服務狀態
sudo systemctl status postgresql
```
# 基本語法
使用\l用於查看已經存在的數據庫
```=
postgres = # \ l
postgres = # CREATE DATABASE dbname;(創建資料庫)
postgres=# DROP DATABASE runoobdb;(刪除)
```
接下來我們可以使用\c + 數據庫名來進入數據庫
```=
postgres =# \c runoobdb
您現在以用戶“postgres ”連接到數據庫“runoobdb” 。
runoobdb =#
```
建DB
```=
CREATE DATABASE database_name;
```
修改欄位設定
```=
ALTER TABLE (news_title) ALTER COLUMN (title) TYPE VARCHAR(1000);
```
刪除
```=
DELETE FROM news_title WHERE news_source = ' value';
```
### PostgreSQL 創建表格以我們的例子為例
```=
CREATE TABLE Keyword_List (
ID INT PRIMARY KEY NOT NULL,
Publish_Date DATE NOT NULL,
Timestamp TIMESTAMP NOT NULL,
News_Source CHAR(50),
Keyword_List TEXT[]
);
```
```=
CREATE TABLE news_articles (
UID SERIAL PRIMARY KEY,
Publish_Date DATE,
Timestamp TIMESTAMP,
Source VARCHAR(100),
Author VARCHAR(100),
R INT,
Title VARCHAR(200),
Content TEXT,
ip VARCHAR(50),
Upvotes INT,
Downvotes INT,
Score INT
);
```
```=
CREATE TABLE postive (
id SERIAL PRIMARY KEY,
date DATE,
keyword TEXT,
ptt_all_content TEXT,
postive INTEGER,
negative INTEGER,
postive_percent DOUBLE PRECISION GENERATED ALWAYS AS (postive::DOUBLE PRECISION / (postive + negative)) STORED,
negative_percent DOUBLE PRECISION GENERATED ALWAYS AS (negative::DOUBLE PRECISION / (postive + negative)) STORED
);
ALTER TABLE gossiping
ADD COLUMN source TEXT DEFAULT 'gossiping';
```
```=
CREATE TABLE hatepolitics (
id SERIAL PRIMARY KEY,
date DATE,
keyword TEXT,
ptt_all_content TEXT,
positive INTEGER,
negative INTEGER,
postive_percent DOUBLE PRECISION GENERATED ALWAYS AS (
CASE
WHEN (positive + negative) = 0 THEN 0
ELSE positive::DOUBLE PRECISION / (positive + negative)
END
) STORED,
negative_percent DOUBLE PRECISION GENERATED ALWAYS AS (
CASE
WHEN (positive + negative) = 0 THEN 0
ELSE negative::DOUBLE PRECISION / (positive + negative)
END
) STORED
);
ALTER TABLE hatepolitics
ADD COLUMN source TEXT DEFAULT 'hatepolitics';
```
使用\d命令來查看表格是否創建成功
election=# \d

使用 \d tablename 查看表格信息
```=
election=# \d keyword_list
```

```=
CREATE SEQUENCE keyword_list_id_seq;
ALTER TABLE keyword_list ALTER COLUMN id SET DEFAULT nextval('keyword_list_id_seq');
SELECT setval('news_title_id_seq', 8820, true);
重設ID起始位置
```
### 用戶管理
創建用戶:
```=
CREATE USER username WITH PASSWORD 'password';
```
刪除用戶:
```=
DROP USER username;
```
修改用戶密碼:
```=
ALTER USER username WITH PASSWORD 'new_password';
```
授予用戶特定數據庫的訪問權限:
```=
GRANT ALL PRIVILEGES ON database_name TO username;
GRANT ALL PRIVILEGES ON DATABASE ptt TO kenny;
GRANT ALL PRIVILEGES ON TABLE table_name TO kenny;
```
撤銷用戶對特定數據庫的訪問權限:
```=
REVOKE ALL PRIVILEGES ON database_name FROM username;
```
修改用戶的名稱:
```=
ALTER USER current_username RENAME TO new_username;
```
修改用戶的角色:
```=
ALTER USER username WITH SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB;
```
列出所有用戶:
```=
SELECT usename FROM pg_user;
```
顯示用戶的詳細信息:
```=
\du username
```
### 篩選
```=
SELECT keyword
FROM articles
WHERE source = 'HatePolitics'
AND title NOT LIKE '[新聞]%'
AND title NOT LIKE '[轉錄]%';
```
##### 條件篩選
```=
SELECT keywords, COUNT(*) AS count
FROM fp_45c
WHERE source = 'HatePolitics'
AND NOT (title LIKE '[新聞]%' OR title LIKE '[轉錄]%')
GROUP BY keywords;
#Gossiping
```
```=
DELETE FROM article
WHERE DATE(publish_date) = '2023-08-15';
DELETE FROM article
WHERE title LIKE '[新聞]%' OR title LIKE '[轉錄]%';
```
對於table `keyword_list`,你可以建立一個觸發器 (trigger) 在每次插入資料時觸發計數。以下是相關的程式碼示例:
首先,建立名為 `keyword_list` 的資料表:
```sql
CREATE TABLE keyword_list (
id serial PRIMARY KEY,
publish_date DATE NOT NULL,
timestamp TIMESTAMPTZ NOT NULL,
news_source VARCHAR(50),
keyword_list TEXT[]
);
```
## trigger
然後,創建一個名為 `keyword_list_trigger` 的觸發器,在每次插入資料時觸發計數:
```sql
CREATE FUNCTION news_title_trigger_function()
RETURNS TRIGGER AS $$
DECLARE
news_count INTEGER;
BEGIN
-- 檢查該新聞來源 (news_source) 是否已觸發過計數
SELECT COUNT(*) INTO news_count
FROM trigger_log
WHERE date = NEW.publish_date
AND news_source = NEW.news_source;
-- 只有在該新聞來源今日尚未觸發計數時才進行計數
IF news_count = 0 THEN
-- 在此處放置觸發計數的程式碼
/* 執行計數相關的操作 */
RAISE NOTICE '觸發計數';
-- 新增 trigger_log 記錄
INSERT INTO trigger_log (date, news_source)
VALUES (NEW.publish_date, NEW.news_source);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_news
AFTER INSERT ON news_title
FOR EACH ROW
EXECUTE FUNCTION news_title_trigger_function();
```
以上程式碼中,`keyword_list_trigger_function` 函數為觸發器的處理函數。觸發器在每次插入 `keyword_list` 表中的資料時被觸發。觸發器首先檢查該新聞來源 (news_source) 是否已在當天觸發過計數,並只有在該新聞來源今日尚未觸發計數時才進行計數操作。然後,觸發器新增一筆 `/trigger_log` 表中的記錄以標記已觸發計數。最後,它將插入的資料返回給 `keyword_list` 表。
請注意,上述示例中使用的 `trigger_log` 資料表並不是我之前提到的 `trigger_log`,這是一個新的表格,用於記錄已觸發過計數的新聞來源。你需要根據需求自行創建該表。