我有一个 SellerProduct 表。表格中的每一行代表卖家提供的产品信息。SellerProduct 表包含以下列:
id (serial, pk)
productName (nvarchar(50))
productDescription (ntext)
productPrice (decimal(10,2))
sellerId (int, fk to Seller table)
Run Code Online (Sandbox Code Playgroud)
不同卖家的产品可能相同,但每个卖家的 productName、productDescription 和 productPrice 可能不同。
例如,考虑产品 TI-89。卖家 A 可能拥有产品的以下信息:
productName = TI-89 Graphing Calc
productDescription = A graphing calculator that...
productPrice 65.12
Run Code Online (Sandbox Code Playgroud)
卖家 B 可能拥有以下产品信息:
productName = Texas Instrument's 89 Calculator
productDescription = Feature graphing capabilities...
productPrice 66.50
Run Code Online (Sandbox Code Playgroud)
管理员用户需要确定不同卖家的产品是相同的。
我需要一种方法来捕获这些信息(即卖家的产品是相同的)。我可以创建另一个名为 SellerProductMapper 的表,如下所示:
sellerProductId1 (int, pk, fk to SellerProdcut table)
sellerProductId2 (int, pk, fk to SellerProdcut table)
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于它允许对给定行的 SellerProductId1 和 SellerProductId2 来自同一个卖家。这不应该被允许。 …
我有两个表:
CREATE TABLE IF NOT EXISTS position(
id_position INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
min REAL NOT NULL CHECK (min > 0),
max REAL CHECK (max > 0),
);
Run Code Online (Sandbox Code Playgroud)
最低,最高工资链接
CREATE TABLE IF NOT EXISTS employee (
id_employee INTEGER PRIMARY KEY AUTOINCREMENT,
id_position INTEGER NOT NULL,
name TEXT NOT NULL,
last_name TEXT NOT NULL,
data_of_birth TEXT NOT NULL CHECK (DATE(data_of_birth) IS NOT NULL AND data_of_birth < DATE('now','localtime')),
salary REAL NOT NULL CHECK (salary >= position.min AND …Run Code Online (Sandbox Code Playgroud) 我刚刚发现table_definition_cache并且我正在尝试决定将其设置为什么。由于性能问题,我弄乱了我的配置。
在一台服务器上,我有 36599 个表,当我运行SHOW GLOBAL STATUSOpened tables 的值是 930312。table_definition_cache设置为 20k。
在另一台服务器上,我有 45349 个表,当我运行SHOW GLOBAL STATUSOpened tables 的值是 94383。table_definition_cache设置为 40k。
我不确定将它设置为什么table_definition_cache值,因为服务器似乎做了很多打开/交换。
两台服务器都是 CentOS 6 并且正在运行
服务器版本:5.6.32-78.0 Percona Server (GPL),78.0 版,修订版 8a8e016
感谢您的关注!我非常感谢您的反馈。
此示例具有用于两个不同表的相同表别名。我不明白为什么 Oracle 允许这样做,如果允许,结果如何有意义。
create table Table_A (x number);
create table Table_B (x number);
insert into Table_A values (1);
insert into Table_A values (2);
insert into Table_B values (2);
insert into Table_B values (3);
select * from Table_A ;
X
----------
1
2
2 rows selected.
select * from Table_B ;
X
----------
2
3
2 rows selected.
select *
from Table_A T
join Table_B T
on T.x = T.x;
X X
---------- ----------
2 2
2 2
3 3
3 …Run Code Online (Sandbox Code Playgroud) 我正在尝试设计数据库表来跟踪最终用户上传的文件。
文件可以在不同的上下文中上传。
每个上下文都是一个不同的表。
举个例子:
这个(人为的)场景中的实体/表是:
Employees (Id, Name) Expenses (Id, Date, RequestedRefund, RequestedByEmployeeId) Pets (Id, Name, Type, BelongsToEmployeeId)我已经有一个名为的表Files,用于跟踪有关文件本身的信息:
Files (Id, Name, Size, Extension, Folder)
我的问题是关于如何根据文件记录映射费用收据上传和宠物照片上传。我知道我可以通过两种方式做到这一点:
有一个通用映射表:GenericFileMap (FileId, ContextId, Type)
where
FileId 是文件记录的id ContextId 是我试图检索的上下文记录的 ID Type 是描述上下文本身的字段 在这种情况下,我会像这样获取员工的所有费用收据:
SELECT *
FROM Employee e
INNER JOIN Expenses ex ON e.Id = ex.RequestedByEmployeeId
INNER JOIN GenericFileMap g ON g.ContextId = ex.Id AND g.Type = 'expense'
INNER JOIN Files f ON g.FileId = f.Id
Run Code Online (Sandbox Code Playgroud)
每个实体/上下文表都有单独的映射表: …
我目前在本地运行 Postgresql 10.6,我使用 PgAdmin 4.12 与之交互,直到今天一切都运行良好。但是今天我在 pgAdmin 查询编辑器中运行了以下查询:
SELECT * FROM test_table LIMIT 100
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
Run Code Online (Sandbox Code Playgroud)ERROR: operator does not exist: - oid at character 125 HINT: No operator matches the given name and argument type. You might need to add an explicit type cast. STATEMENT: SELECT at.attname, at.attnum, ty.typname FROM pg_attribute at LEFT JOIN pg_type ty ON (ty.oid = at.atttypid) WHERE attrelid=-1519044407::oid AND attnum = ANY ( (SELECT con.conkey FROM pg_class rel LEFT OUTER JOIN pg_constraint con ON con.conrelid=rel.oid AND …
我创建一个表并用数据填充它:
create table tab
as
select 'value' || level val
from dual
connect by level <= 10000;
Run Code Online (Sandbox Code Playgroud)
如果我然后删除所有行并插入相同的数据:
delete from tab;
insert into tab
select 'value' || level val
from dual
connect by level <= 10000;
commit;
Run Code Online (Sandbox Code Playgroud)
每次执行删除然后插入时表大小都会增加。多次执行这些操作会导致表增长到原始大小的许多倍。
我希望大小保持(大约)相同。为什么会这样?
删除将空间标记为空闲,它实际上并没有缩小段。后续插入应首先使用 HWM 以下的可用空块。
我可以使用alter table tab shrink space.
我在 Oracle 12 和 Oracle 18c 中进行了测试。
我使用 SQL Server 2016 进行这些测试。
以下不允许我在模式 S 中为用户 U 创建表
USE [D];
GRANT CONTROL ON SCHEMA :: [S] TO [U];
Run Code Online (Sandbox Code Playgroud)
但这确实:
USE [D]
GRANT ALTER ON SCHEMA :: [S] TO [U];
GRANT CREATE TABLE TO [U];
Run Code Online (Sandbox Code Playgroud)
如果您必须运行这两个附加命令以允许用户在特定模式中创建表,那么 GRANT CONTROL 应该做什么?
这个描述很好,但是我可以运行什么样的用例来确认(成功或失败)GRANT CONTROL 命令在运行该命令之前和之后在物理上影响用户在使用和不使用此模式的数据库上的安全性?
CONTROL 权限:CONTROL 权限可用于轻松地将某个实体的所有权限授予某个主体。它是实体所有权之后的下一个最好的东西,但它不如所有权那么强大。主要区别在于 CONTROL 的被授予者仍然可以被拒绝对实体的一些其他权限。例如,我可以在一个表上被授予 CONTROL,同时我可以在那个表上被拒绝 SELECT,从而阻止我从中选择——这永远不会发生在所有者身上,因为所有者不能被授予或拒绝权限.
我的表格或多或少如下:
table Sample (
location bigint,
device bigint,
timestamp datetime,
type bigint,
value bigint,
)
Run Code Online (Sandbox Code Playgroud)
出于性能原因,我们也有一个强大的索引,它具有相同顺序的相同列,除了value在索引中包含而不是使用。
这按预期工作,除了 AFAIU 数据在数据库中保存两次 - 一次在表中,一次在索引中。
问题:从概念上讲,是否有某种方法可以将数据仅保留在索引中?我相信这需要以与索引组织相同的方式组织表,从而有效地消除对索引的需求。我试图创建模拟上述索引的组合主键,但它归结为自动创建相同索引。
我们有一个相当大的 MS SQL 数据库,有数百万行。我创建了一个简单的脚本来删除超过 1 个月的行,但这似乎锁定了表并给应用程序带来了麻烦。
该表有一个索引的“ID”PK,还有一个我将用于此任务的“日期”列。
在不导致锁定的情况下执行此操作的最佳方法是什么?我正在考虑分区,但不确定它是否是最好的方法。提前致谢。
table ×10
sql-server ×4
delete ×2
oracle ×2
alias ×1
index ×1
innodb ×1
insert ×1
many-to-many ×1
mysql ×1
objectid ×1
oracle-12c ×1
partitioning ×1
percona ×1
permissions ×1
pgadmin-4 ×1
postgresql ×1
security ×1
select ×1
size ×1
sqlite ×1