我已经搜索了所有可能的东西)真的。但是,只有在检查列是否存在之后,我才能找到添加新列的正确方法。我正在用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
每次调用程序时,每个函数都检查数据库是否存在,然后不是从头开始创建,如果表存在,则不创建,现在我偶然发现如何检查列是否存在,因为如果它们存在做,我收到错误,程序无法继续。
答案 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` = ?
动态创建数据库模式是错误的,它只是反对模式的整体思想,数据库有一个模式,因此您可以编写依赖于它们工作的查询,该语言称为结构化查询语言有一个原因。