标签: dbms

`COUNT` 是否丢弃重复项?

我的教授教了我这个 SQL 语句:

SELECT COUNT(length) FROM product
Run Code Online (Sandbox Code Playgroud)

将返回2以下数据集:

product
|id | length | code |
|-------------------|
| 1 |    11  | X00  |
| 2 |    11  | C02  |
| 3 |    40  | A31  |
Run Code Online (Sandbox Code Playgroud)

她说这COUNT不算重复。我不同意。在尝试了很多 DBMS 之后,我从来没有发现有这种行为的。是否存在这样的 DBMS?

dbms

41
推荐指数
3
解决办法
1万
查看次数

运行两个使用相同数据目录的 MySQL 服务器

情况

我有两个 MySQL 实例,部署在两台不同的远程机器上。
两个 MySQL 实例访问相同的数据目录,该目录存储在一个持久卷上(该卷由 Gluster 提供,但这并不真正相关,我只是为了完整性才这么说)。

我知道强烈建议不要使用相同的数据目录运行两个 MySQL 服务器,但只要采取正确的预防措施,这不是不可能的事情。为了做到这一点,我按照官方文档(https://dev.mysql.com/doc/refman/5.6/en/multiple-data-directories.html)建议的步骤,更具体地说是在名为警告的段落中. 把它们加起来:

  • 我正在使用 MySQL 5.6。
  • 根据需要,我使用 MyISAM 作为默认引擎。
  • 我指定了每个服务器唯一的日志文件名。
  • 一台服务器将是可读写的,而另一台服务器将是只读的。

所以,我设置了一切,我导入了一个测试数据库,一切都完美无缺。两台服务器都可以从同一个数据目录中读取数据。

问题

现在问题来了。只要一台服务器执行写入(通过向表中插入一行),另一台服务器就会将该表标记为自己已损坏。在研究了一段时间后,我发现了为什么会发生这种情况。基本上每个服务器都拥有描述每个表的自己的元数据。因此,一旦第一台服务器更新了表,它也会更新自己的元数据,但不会更新第二台服务器的元数据。当第二台服务器检查表时,它注意到表中的当前行数与其先前保存在其元数据中的行数不匹配,因此它将表标记为已损坏。经过一番研究,结果证明元数据保存在名为information_schema的默认数据库中. 一开始,我想让两台服务器共享同一个information_schema,但是找不到。后来我发现,它保存在程序的内存中,您无法手动更新或访问它。

问题

  1. 由于文档确切地告诉了您要采取哪些预防措施,因此我希望这能真正起作用……否则,官方文档中该指南的意义何在?如果这不能做到,为什么它首先会告诉你如何去做?
  2. 最重要的是,您知道如何使用 MySQL 完成这项工作吗?
  3. 如果没有,您是否知道其他任何 DBMS 允许您获得此结果(即运行使用相同数据目录的两个服务器)?

请记住,我不想设置主从复制。
欢迎所有其他建议,谢谢大家的帮助。

编辑:我最终没有这样做,因为每个人都劝阻我不要这样做。谢谢各位的意见!

mysql dbms

6
推荐指数
1
解决办法
2504
查看次数

FileWatcher 故障排除选项

我已经设置了一个凭据/程序/程序/文件观察程序/作业来监视新文件的文件夹,但它不起作用。我想弄清楚我可以检查什么来解决为什么这不起作用。在将代码缩减到最低限度之后,以下是我已经完成的事情。

  • 验证是否正在监视的文件夹中创建文件 - 它们是。
  • 验证该过程是否可以自行运行 - 它可以。
  • 验证文件观察器是否显示在 DBA_Scheduler_File_Watchers 中并已启用。- 确实如此。
  • 验证 DBA_Scheduler_Job_Run_Details 是否显示成功执行 - 它不显示此作业的任何条目。
  • 检查警报日志 - 没什么有趣的。
  • 检查其他跟踪文件 - 我正在获取匹配的跟踪文件*_j000_*.trc,但他们只有这个:FILE_TRANSFER error is:后面没有任何内容。

有人可以解释我做错了什么或给我一种方法来进一步解决这个问题吗?这是我的测试代码:

--Create Credential.
BEGIN
    sys.dbms_scheduler.create_credential(
        username => 'oracle',
        password => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        database_role => NULL,
        windows_domain => NULL,
        comments => NULL,
        credential_name => 'TestCredential'
    );
END;
/


CREATE TABLE FilesFound(FoundDate Date);


CREATE OR REPLACE PROCEDURE TestProcedure(iFileInfo In sys.scheduler_filewatcher_result) AS
BEGIN
   INSERT INTO FilesFound VALUES (sysdate);
   COMMIT;
END;
/


BEGIN
   DBMS_SCHEDULER.create_program(
      program_name => 'TestProgram', …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2 jobs dbms

5
推荐指数
1
解决办法
1804
查看次数

将 CSV 文件复制到具有动态列数的临时表?

我想知道是否有办法将 csv 文件复制到临时表中,其中 csv 文件中的列数未知。我使用的数据库软件是 PgAdmin III。我发现如果我知道列数,那么我可以创建一个包含该列数的临时表,然后像这样复制 csv 文件:

   CREATE TEMPORARY TABLE temp
   (
      col1 VARCHAR(80),
      col2 VARCHAR(80),
       ....
      coln VARCHAR(80)
   );

COPY temp FROM 'C:/Users/postgres/Boost.txt' CSV HEADER DELIMITER E'    '
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试简单地将 csv 文件复制到临时表中没有列的临时表,Postgresql(8.4 版)会抱怨我正在使用一个列数少于 csv 文件的表。我一直在研究,但似乎在 Postgresql 文档中找不到任何关于此的内容。有谁知道在 Postgresql 中是否可以将 csv 文件复制到具有在运行时决定的任意数量的列的临时表中?一旦临时表加载了 csv 文件,我计划在它被销毁之前用临时表与其他表进行一些比较。csv 文件中的第一行也包含标题。

postgresql dbms temporary-tables csv

5
推荐指数
1
解决办法
2万
查看次数

Oracle 11gR2:ORA-01102:无法在 EXCLUSIVE 模式下挂载数据库

我在 AIX 机器上运行 Oracle 11gR2。我使用 NID 重命名了数据库并更改了 DB ID。我可以在 nomount 模式下重新启动 db,但由于以下错误我无法挂载它。

ORA-01102: cannot mount database in EXCLUSIVE mode
ALTER DATABASE OPEN RESETLOGS
*
ERROR at line 1:
ORA-01507: database not mounted
Run Code Online (Sandbox Code Playgroud)

我使用新的 pfile 启动了 DB。我注意到 NID 实用程序没有更改 ASM 中旧的 DB 文件夹名称。所以这个重命名数据库的努力不会是完美的。

当我在 Google 上搜索此错误时,我已经删除了一些简单的内容,例如删除 $ORACLE_HOME/dbs 下的 lk* 文件。

对我在 NID 重命名命令后启动数据库有什么建议吗?

非常感谢!

oracle dbms

5
推荐指数
2
解决办法
3万
查看次数

Postgres 会处理 Unix Epoch 问题吗?

我想知道 Postgres 是否会处理 2038 年出现的 unix 纪元问题?我读过这篇文章并且很想知道。

这显然与生产力有关,因为它距离太远,但我很好奇。

postgresql dbms

5
推荐指数
1
解决办法
2157
查看次数

独立的应用程序会导致回滚到彼此的事务吗?

我有一个建立在 SQL Server 上的数据库

应用程序 1 [旧版应用程序]:

用 C# 编写,并在上述数据库上运行事务。

应用程序 2 [正在开发的新应用程序]:

用 Python 编写,并在上述数据库上运行事务。

注意事项:

  • 这些应用程序访问同一组表并执行类似的操作。

  • 随着时间的推移,我们正在尝试从较旧的应用程序过渡到较新的应用程序。

  • 我发现系统中发生了几个死锁和回滚。

问题

  1. 我想了解通过一个应用程序运行的事务是否有可能影响来自独立的其他应用程序的事务。

  2. 这些场景是由 DBMS 本身在内部处理还是必须在应用程序级别处理?

sql-server transaction rollback dbms data-tier-application

4
推荐指数
1
解决办法
116
查看次数

术语“页面”在 DBMS 和操作系统术语中是否具有相同的含义?

我正在学习DBMS的数据格式,发现我们有一个术语:page

页面是从外部存储(例如磁盘,SSD)获取的主内存中的数据,当这些页面被查询获取时,几个页面将首先“缓存”到低级缓存

这让我想起了操作系统和计算机体系结构中使用的同一个术语页面。来自 Wiki 的关于这个“分页”的一些正式描述是:

分页是一种内存管理方案,计算机通过该方案从辅助存储器中存储和检索数据以在主存储器中使用。在此方案中,操作系统从称为页的相同大小的块中检索辅助存储中的数据。分页是现代操作系统中虚拟内存实现的重要组成部分,使用二级存储让程序超过可用物理内存的大小。


那么就涉及到第一个问题:

  1. 术语页面在 DBMS 和 OS 中具有相同的含义吗?

    • 如果是,您能稍微解释一下问题 2吗?
    • 如果不是,你能解释一下原因吗?他们有不同的实施方式吗?

更进一步:

  1. 在讲座中我们学习了N-ary Storage Model(NSM 或 slotted pages)PAX(Partition Attributes Across), 参考 Ailamaki 教授的这篇论文。假设page在DBMS和OS中的含义是一样的,为什么我们只在DBMS中指定NSM和PAX呢?这种页面格式可以移植到操作系统吗?(关于论文会很有帮助,你只需快速浏览数据布局和图表。)

问题2是主要的原因,我在这里提高的问题,并开始问自己,为什么NSM,PAX页面专用DBMS。这个问题更笼统,并不关注任何特定的 DBMS。

data-pages terminology dbms

4
推荐指数
1
解决办法
738
查看次数

存储大量用户加密数据的最佳方法是什么?

我将要开发一个主要存储用户加密数据的应用程序。每条数据都通过 AES 密钥加密,AES 密钥本身使用每个授权用户的公共 RSA 密钥加密。

鉴于非加密数据的数量可以忽略不计(可能只有用户登录、一些日期和外键),我想知道“标准 DBMS”如 PostgreSQL 或 MySQL 是否是一个不错的选择。

事实上,这些 DBMS 经过优化,可以处理不同类型的数据(文本、整数、日期等)、索引、流程演算、聚合等。

就我而言,我将存储的绝大多数数据都是大块的文本(或者可能是二进制数据)。大部分所需的演算将在客户端解密后进行处理。

因此,我将无法解析我的数据。所以即使我有一个庞大的数据库,它也不会被称为“大数据”。但是,我想知道 MongoDb、MemSQL 或其他任何东西是否不是更准确的选择。如果没有,最好的 DBMS 是什么以及将它用于我的目的的最佳方式是什么?

换句话说,我认为每个 DBMS 都必须做出牺牲,以便在最重要的功能上更高效。我也认为上面详述的案例不是那么随意。所以我假设有很多我不需要的功能(或者我不能使用,例如 FULLTEXT 搜索)。另一方面,我可能需要被“标准 DBMS”丢弃的特性。

encryption dbms

3
推荐指数
1
解决办法
2926
查看次数

2
推荐指数
1
解决办法
3万
查看次数

可以将某个/某些 DBMS 安装为操作系统吗

是否有任何 DBMS 可以安装为操作系统而不是操作系统上的应用程序?我找不到任何。

稍后编辑,只是为了澄清:我习惯于将 DBMS(MySQL、MSSQL)作为服务器(ice)安装到操作系统(Windows、Ubuntu 等)上。我试图找出是否有一些 DBMS 不需要底层操作系统并且直接在硬件上作为操作系统“安装”。我在这里问是因为谷歌搜索没有帮助。感谢我得到的答案,答案似乎接近“否”

dbms

1
推荐指数
1
解决办法
75
查看次数

主键是否只包含一个 Null 值...?

我的工作

  • 主键是唯一的,并且只有一个包含表。

  • 表中可以包含许多唯一键。

  • 在 SQL Server 中,主键不可为 Null。但是,唯一键可能只包含一个空值。

我的问题:

实际上,在 SQL Server 中,主键不可为空。但是从理论上讲,当它允许唯一键中的 Null 值时,为什么我们不能在键中只有一个 Null 值呢?

谢谢回答我的问题

很抱歉问了一个一般性问题,在阅读了答案后,我对 DB 中的空值有了一个清晰的了解。

此外,我对 C++、Jave 等编程语言感到困惑,在这些语言中,空值可以进行比较。做了一些工作后,我明白Null 在SQL 中是没有可比性的。

在 C++、Java 等编程语言中...

Null==Null 
Run Code Online (Sandbox Code Playgroud)

返回真

但是,在 SQL 中

Null==Null 
Run Code Online (Sandbox Code Playgroud)

返回 FALSE,因为 Null 值是未知的,它可以是任何值。

primary-key dbms unique-constraint

1
推荐指数
1
解决办法
1063
查看次数

需要sql来表示关系否定和日期比较问题

我有以下表格:

  • 员工(eid,ename,salary,did,classification)
  • 项目(pid,pname,did,budget,ddate)
  • 部门(did,dname,floor,head)
  • dbudget(did,byear,budget)
  • 项目(pid,pname,did,budget,ddate)
  • Onproject(pid,eid,fdate)

做了部门标识符,所以我们需要一些在employee.did但不在project.did中的东西

我想检索所有未通过截止日期的项目,并且其所有工作人员都属于不负责该项目的部门。

现在,我不知道如何检查 ddate 是否已结束(ddate 是截止日期,我不知道它是否已通过),以及如何在查询中表示它。

我将展示我到目前为止构建的查询:

SELECT   Project.pname 
from         Project 
FULL OUTER JOIN Employee 
on   Project.did <>  Employee.did 
AND .... 
Run Code Online (Sandbox Code Playgroud)

(不知道如何检查 ddate 是否通过)是否有一个函数可以在 SQL 中显示日期进行比较(因此差异将是正的)或使用给定信息的任何技巧?

select dbms

0
推荐指数
1
解决办法
146
查看次数