我一直想知道以下方法是否不好或真的非常糟糕:)。
问题#1:我们可以使用和表indicator_id中的数据进行合并(不使用)[我们知道我们可以,因为我们这样做了,但是它可以接受吗:)]?indicator_valuesindicator_detailsFOREIGN KEY
问题#2:如果我们决定使用indicator_id(indicator_details表中不是PK),它会对性能产生重要影响吗?
正确理解 SQL 方法,最好的选择是在表中使用iid( iidas FOREIGN KEY)indicator_values而不是indicator_id,但项目总是有一些限制(比如用户插入数据的方式 - 下面详细介绍),因此我们试图找到一个折衷的解决方案。
我知道这可能会导致数据完整性问题,但是没有 FK 的解决方案将非常用户友好(因为用户不必担心插入indicator_values表中正确的行 - 具有正确的行iid),特别是在我们的情况下,数据完整性是并不重要。此外,如果用户插入数据的唯一方法(在我们的例子中)是先从表中删除所有行,则使用 FK 的方法将导致在表更新ON DELETE期间从指标值中删除所有行(由...引起)indicator_details(再次 - 更新)意味着:删除所有行然后插入新数据),所以这会很耗时。
D B:
指标值表
+----------+--------------+------+-------+
| vid (PK) | indicator_id | year | value |
+----------+--------------+------+-------+
| 1 | AACA | 2001 | 10 |
| 2 | bbb | 2001 | …Run Code Online (Sandbox Code Playgroud) 我的数据库中有两个表students:
GRADE_REPORT:
+----------------+-------------+------+
|Student_No . | SectionId | Grade|
+----------------+-------------+------+
| 11 | 85 | B |
| 17 | 112 | B |
| 17 | 119 | C |
| 17 | 135 | A |
| 8 | 85) | A |
| 8 | 92 | A |
+----------------+-------------+------+
Run Code Online (Sandbox Code Playgroud)
学生:
+----------------+-------------+------+--------+----------------+
| Studentnumber | name | Classification| DepartmentName |
+----------------+-------------+---------------+----------------+
| 17 | Bill Smith | 1 | CS |
| 8 | Bob …Run Code Online (Sandbox Code Playgroud) 有没有办法设置触发器,它会在创建新表后激活并获取新表名称?我能够提出下面的查询,但它只能按字母顺序获取第一个查询,而不是按创建日期
CREATE TRIGGER CreateTable
ON DATABASE
FOR CREATE_TABLE
AS
DECLARE
@table varchar(max);
SELECT top 1 @table = [name] FROM sys.tables
insert into NewTable values(@table)
;
end
Run Code Online (Sandbox Code Playgroud) 我在我的 Oracle DB 模式中看到一个“丢失”表周围的奇怪行为。
最终目标是收集我们团队使用的所有表的统计数据。所有这些表都有一个共同的前缀 - rca。
因此,我正在使用以下方法获取表列表:
SELECT *
FROM ALL_OBJECTS
where OBJECT_NAME like 'rca%'
AND OBJECT_TYPE = 'TABLE';
Run Code Online (Sandbox Code Playgroud)
此查询返回一个名为 的表rca_related_materials。
我们正在使用由其他团队开发的功能,该功能为我们完成收集统计数据的工作。我们只是将 owner_name 和 table_name 传递给该函数。
为此表名调用该函数或运行
analyze table rca_related_materials compute statistics for table;
Run Code Online (Sandbox Code Playgroud)
甚至,
select *
from rca_related_materials;
Run Code Online (Sandbox Code Playgroud)
返回以下错误报告
SELECT *
FROM ALL_OBJECTS
where OBJECT_NAME like 'rca%'
AND OBJECT_TYPE = 'TABLE';
Run Code Online (Sandbox Code Playgroud)
如何从 ALL_OBJECTS 表中删除此条目?
PS:我在 USER_TABLES 和 DBA_TABLES 中也看到了相同的条目。
我的数据库中有一个名为 Group 的表,当我尝试处理它时出现错误:
SELECT GroupID,GroupName FROM Group
Run Code Online (Sandbox Code Playgroud)
它说 :
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'Group'.
Run Code Online (Sandbox Code Playgroud)
我知道 Group 是表的非法名称,但它是一个旧数据库,数据和关系太多,我无法重命名该表,有什么办法可以处理表吗?
当我们向现有表中添加新列时,正确的方法是什么?
例如,我已经有像 Foo1、Foo2、Bar1、Bar2 这样的列。现在我想添加一个名为 Foo3 的新列。
当我想添加具有相似名称的列时,标准方法是什么(如果是这样的话)?
我看到 2 个选择:
为了获得一些参考,我们正在使用数据库项目来控制数据库更改,并为应用程序开发人员提供更好的 GUI 以进行数据库更改。我们使用某种 ORM 与数据库交互,因此没有人使用数据库对象名称查询数据库。
更新: 我在一些现有列上有几个索引。但是名称相似的列(包括我想添加的列)不属于任何索引。
我正在 SQL Server 上开发一个数据库项目,我在考虑使用列存储索引是否是一个好主意。
该项目由一个表 (A) 组成,该表将包含大量行,一列具有许多重复值。每天,一包新行将添加到表中,每个包都有一个“DateId”。
之后,我需要更新一个不同的表 (B) 加入 A 并过滤 A 以获取“DateId”和其他列。
SQL 中的示例:
CREATE TABLE A (
[Id] [BIGINT] IDENTITY(1,1) NOT NULL,
[DateId] [INT] NOT NULL,
[B_Id] [BIGINT] NOT NULL,
-- other columns...
INDEX cci_A CLUSTERED COLUMNSTORE
)
CREATE TABLE B (
[Id] [BIGINT] IDENTITY(1,1) NOT NULL,
-- other columns...
INDEX cci_B CLUSTERED COLUMNSTORE
)
UPDATE B
SET ...
FROM A
INNER JOIN B ON A.B_Id = B.Id
WHERE A.DateId = @myDateId
Run Code Online (Sandbox Code Playgroud)
在这种情况下,列存储是一个不错的选择吗?
声明默认列值时不允许使用列名。有没有解决方法来实现这样的目标?
CREATE TABLE [dbo].[Tasks]
(
[TaskId] INT IDENTITY(1,1) NOT NULL,
[TaskName] NVARCHAR(255) NULL,
[Priority] INT NOT NULL UNIQUE DEFAULT Max(Priority)+1, -- not allowed
)
Run Code Online (Sandbox Code Playgroud)
要求是默认情况下最新的任务获得最低优先级(最高 int 值)。在任务在表中之后,它可以被优先化/去优先化,例如优先级值与表中的任何其他任务交换。
使用 phpmyadmin/heidisql 等界面时,我有以下表格:
account
account_post
account_post_status
account_post_type
account_status
account_type
Run Code Online (Sandbox Code Playgroud)
对我来说理想的是这样的:
account
account_type
account_status
account_post
account_post_type
account_post_status
Run Code Online (Sandbox Code Playgroud)
所以我发现使用数字作为前缀是完美的。它完全按照我的意愿完成工作。我的意思是:
01_account
02_account_type
03_account_status
04_account_post
05_account_post_type
06_account_post_status
and so on
Run Code Online (Sandbox Code Playgroud)
我读了几个像我这样的主题,用户想要为表格添加前缀,但原因不明。我的原因是因为我想以特定的顺序在界面中看到它们。上面列出的表格只是一个例子。我的数据库中最多有 40 个表,使用数字对它们进行排序非常有趣。
我还阅读了表的 sql 命名约定,我明白用数字作为表名前缀根本不是一个好习惯。我发现一些数据库系统甚至不接受以数字为前缀的表名。
不管怎样,对我来说,只有一点点劣势。应用程序本身。我现在在 PHP 中使用 mysql。当我将使用查询从数据库中选择/插入/更新等时,我还应该使用前缀,这很烦人。但是我将创建一个函数来从已知列表中添加前缀(因为我可能想在此期间更改顺序)。例子:
"SELECT id FROM ".add_table_prefix('account')." WHERE whatever"
Run Code Online (Sandbox Code Playgroud)
我还有一个命名外键的约定,这些名称包括表名。我不会在那里添加前缀。
另外,我不知道 phpmyadmin 或其他用于 mysql 的 GUI 是否可以选择为表创建自定义订单,但这不符合我的兴趣,因为我希望在没有其他配置的情况下访问数据库的任何地方都有这个订单。
我在听。我的所作所为有多糟糕?这里有一个人做到了这一点?
编辑:
老实说,在数据库中,与数据库中的表相比,表中的列数更常见。在这种情况下,请给我一个很好的理由,说明为什么我们想要对列进行排序(如我们所愿,并且确实如此)但我们不想对表进行排序。
对表中的列进行排序的唯一好处是为了我们的视图,对吗?为什么不对表也这样做呢?仅仅因为 SQL 语言没有实现这一点(所以是 GUI),这并不意味着对表进行排序没有意义,对吧?
我有一个 3NF 规范化数据库设计,并试图理解强实体类型与弱实体类型的概念,我的理解是弱实体类型是没有主键的表。但是,所有表都应该有一个主键,从而使它们成为一个强大的实体吗?那么我所有的表都是强实体吗?或者我错过了什么?
重新思考,我的连接表有复合键,(在 maria db 中也制作了一个复合键,您执行 PRIMARY KEY(column1, column2)),那么这些类会作为弱实体吗?
这是在PostgreSQL中创建新表的方法,
CREATE TABLE foo (
foo_id int PRIMARY KEY,
bar text,
);
Run Code Online (Sandbox Code Playgroud)
如果需要检查该表是否已存在并CREATE仅在未找到时继续处理,我该如何执行此操作?
table ×11
sql-server ×5
mysql ×3
performance ×2
columnstore ×1
foreign-key ×1
index ×1
mariadb ×1
oracle ×1
postgresql ×1
select ×1
trigger ×1