postgresql表不存在是为啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了postgresql表不存在是为啥相关的知识,希望对你有一定的参考价值。

参考技术A 先用pgadmin看表是不是真的不存在?
有可能是连接的问题,也有可能是表本身就不存在。本回答被提问者采纳
参考技术B 1,确实没有创建这个表
2,你的用户没有访问权限
参考技术C 应该更详细地描述一下问题 参考技术D 你确定表创建好了?

为啥这个插入语句与表不匹配?

【中文标题】为啥这个插入语句与表不匹配?【英文标题】:Why does this insert statement not match the table?为什么这个插入语句与表不匹配? 【发布时间】:2016-11-14 17:04:41 【问题描述】:

我正在使用 Visual Studio 2015 数据库项目尝试将行插入到项目创建的数据库表中。 Insert sql 在 SSMS 中的同一张表中工作,但在通过项目运行时不起作用。

我收到错误:Column name or number of supplied values does not match the table definition.

TSQL 插入脚本:

if not exists (select top 1 1 from [dbo].[PricingGroupTypes]) begin
    INSERT INTO [dbo].[PricingGroupTypes]
               ([Name])
         VALUES
               ('User')
               ,('Product Format')
    print 'Pricing Group Types added'
end

表定义(在数据库项目中):

CREATE TABLE [dbo].[PricingGroupTypes] (
    [Id]   INT            IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (250) NOT NULL,
    CONSTRAINT [PK_PricingGroupTypes] PRIMARY KEY CLUSTERED ([Id] ASC)
);

表定义(通过 ssms):

USE [Toyland]
GO

/****** Object:  Table [dbo].[PricingGroupTypes]    Script Date: 11/14/2016 11:05:05 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[PricingGroupTypes](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](250) NOT NULL,
 CONSTRAINT [PK_PricingGroupTypes] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

同一脚本中的其他插入似乎没有失败,但整个脚本会回滚,因此执行后数据库为空。而且,就像我说的,当我在 SQL Server Management Studio 中运行完全相同的脚本时,它可以工作。

也许我缺少一些 Visual Studio 设置,但这是整个项目中最直接的脚本部分,所以你可以看到我为什么感到困惑。

【问题讨论】:

我认为这是其他一些插入语句,或者您在构建查询时在项目中放错了括号 你的表有触发器吗? @ChrisPratt 那应该给我两行。 ID 列是由数据库生成的,所以我只需要给出名称即可。 听起来很像您正在插入您认为的不同表(不同的架构等),或者您的陈述不是您的想法。使用分析器查看您实际执行的操作可能会有所帮助。 我会接受@JamesZ 的建议,即尝试使用分析器查看实际发生的情况 - 不幸的是,我看不出您的代码有任何问题。 【参考方案1】:

最后,这里有一条评论表明这可能是项目生成的我的整个脚本的其他部分存在问题。事实证明是这样的。我现在已经解决了这个问题,原始问题中的代码没有改变。

不幸的是,我不知道大脚本的哪一部分是罪魁祸首,因为我必须经历并进行一些其他更改才能使一切顺利进行,但似乎没有任何问题使用我原来问题中的 SQL。

【讨论】:

【参考方案2】:
if not exists (select top 1 1 from [dbo].[PricingGroupTypes]) begin
    INSERT INTO [dbo].[PricingGroupTypes]
           ([Name])
         VALUES
           ('User')
           ,('Product Format')
    print 'Pricing Group Types added'
end

您的问题是您试图将两个值插入一列。尝试在 [Name] 中插入“用户”和“产品格式”将返回错误,因为它需要产品格式的目标。更新您的插入语句以包含第二列,它应该会去。

【讨论】:

我相信这是一次插入多行的有效语法。你把它和VALUES ('User', 'Product Format')混淆了。 虽然可能是兼容性或 DB 级别设置可以将 VALUES ('User'),('Product Format') 解释为 VALUES ('User', 'Product Format'),但也许值得 OP 检查。 这是一个 SQL Server 2012 Express 数据库。这应该是两行的好 SQL。另外,我提到如果我在 SSMS 环境中执行这个脚本,它会成功运行,但不是这个 Visual Studio 项目的一部分。

以上是关于postgresql表不存在是为啥的主要内容,如果未能解决你的问题,请参考以下文章

JAVAweb 登录的时候 报数据库 表不存在 是为啥

postgres 错误:Postgresql 11.6 中的列不存在错误

在SQL*Plus里面已经显示创建表成功了,可是后面为啥又说表不存在呢?

为啥 Brew 安装的 postgres 看这里?

为啥 PostgreSQL 不喜欢大写的表名?

为啥 SERIAL 不能在 Postgres 中处理这个简单的表?