C API mysql如果列不存在错误的语法,请添加列

时间:2017-02-05 13:13:54

标签: mysql c

我已经搜索了所有可能的东西)真的。但是,只有在检查列是否存在之后,我才能找到添加新列的正确方法。我正在用C写一个程序。 这是我正在做的事情,我无法在语法中找到我的错误。我将非常感谢你的帮助!我收到错误You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use

//create buffer to store the query
char buff[1024];
//store query in the buffer                
snprintf(buff, sizeof buff, "IF NOT EXISTS(SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME = '%i' AND TABLE_NAME = '%s' AND TABLE_SCHEMA = '%s') THEN ALTER TABLE `%s`.`%s` ADD COLUMN `%i` INT; END IF;", value1, table, database, database, table, value1);

修改

我正在编辑帖子以显示我想要实现的目标。 在main函数中使用嵌套的if语句,我创建了数据库和表,并使用列名填充了表;我的代码的设计方式是所有函数都是相互关联的:只有建立了连接,程序才会调用"创建数据库"功能;只有创建了数据库,程序才会调用"创建表"功能;只有在创建表并且最初只添加了两列(id和Names)时,程序才会调用函数来更改表以添加其他列。

我这样做是因为我需要一个for循环来循环那些以前由我以前的C程序创建的其他列名。 所以表格看起来应该是这样的:

id   name   1988   1977   1966   1955
1    name1  value  value  value  value
2    name2  value  value  value  value
3    name3  value  value  value  value

每次调用程序时,每个函数都检查数据库是否存在,然后不是从头开始创建,如果表存在,则不创建,现在我偶然发现如何检查列是否存在,因为如果它们存在做,我收到错误,程序无法继续。

1 个答案:

答案 0 :(得分:0)

要添加列,您可以这样做

snprintf(
    buff, 
    sizeof buff, 
    "ALTER TABLE `%s`.`%s` ADD COLUMN IF NOT EXISTS `%s` `%s`", 
    database,
    table, 
    column_name, 
    column_type
);

请注意,在您的格式字符串中,有%i看起来不正确。

在给出答案之后,因为这就是你要求的,我想说在代码中添加一个列似乎是一个坏迹象。 SQL数据库的结构非常静态,您永远不需要添加或删除列。如果必须,那么数据库设计或处理方式都会出现问题。

根据下面的评论,你需要这样的东西

CREATE TABLE `names` (
    `name` VARCHAR(128) PRIMARY KEY
) ENGINE = InnoDB;

CREATE TABLE `entries` (
    `name` VARCHAR(128) NOT NULL,
    `year` INTEGER NOT NULL,
    -- Or the required type (FLOAT perhaps?)
    `value` INTEGER NOT NULL,
    -- All names MUST come from the `names` table
    CONSTRAINT `name_fk` FOREIGN KEY (`name`) REFERENCES `names` (`name`),
    -- Allow only one entry per `name`/`year`
    CONSTRAINT `entry_pk` PRIMARY KEY (`name`, `year`)
) ENGINE = InnoDB;

然后您可以在names表格中插入每个名称,并在entries表格中每年输入一个条目,您可以拥有所需的组合,并且可以查询给定名称的所有年份

SELECT * FROM `entries` WHERE `name` = ?

动态创建数据库模式是错误的,它只是反对模式的整体思想,数据库有一个模式,因此您可以编写依赖于它们工作的查询,该语言称为结构化查询语言有一个原因。