这两个查询有什么区别:
START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
并且没有交易:
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
Run Code Online (Sandbox Code Playgroud)
SELECT
内部交易有什么影响?
如果在这两种情况下都在DELETE FROM orders WHERE id=1
另一个会话之后立即调用SELECT
,它将在什么时候被处理?
我从这里复制了这段代码:
CREATE TABLE records(
email TEXT REFERENCES users(email),
lat DECIMAL,
lon DECIMAL,
depth TEXT,
upload_date TIMESTAMP,
comment TEXT,
PRIMARY KEY (upload_date,email)
);
CREATE TABLE samples(
date_taken TIMESTAMP,
temp DECIMAL,
intensity DECIMAL,
upload_date TIMESTAMP,
email TEXT,
PRIMARY KEY(date_taken,upload_date,email),
FOREIGN KEY (upload_date,email) REFERENCES records(upload_date,email)
);
Run Code Online (Sandbox Code Playgroud)
引起我注意的第一件事是使用自然复合键作为两个表的主键。
我能够从这段代码中提取 3 件事:
users
表(此处未显示)email
用作text
..类型的主键。records
表使用复合键text
+ timestamp
。samples
表使用 3 个类型为text
+ timestamp
+ 的字段的复合键timestamp
。现在在这种情况下,代理键不是更好的识别吗?我的意思是性能明智的索引 anint
应该比索引 a …
performance index database-design best-practices primary-key