Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: BULK INSERT при двух связанных таблицах ?

Есть 2 таблицы и интерфейс их наполнения:

Код

CREATE TABLE `serial` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `serial` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial` (`serial`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `player` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mac` varchar(255) NOT NULL,
  `serial_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mac` (`mac`),
  UNIQUE KEY `serial_id` (`serial_id`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


Проблема в том, что эти две таблицы связаны между собой (serial_id один к одному) и я не могу использовать BULK INSERT (т.к. необходимо сначала вставить запись в одну таблицу, узнав ее PRIMARY KEY, затем вставить запись в другую связанную таблицу используя полученный PRIMARY ID ). 

То есть я делаю парсинг примерно такого файла:

00:16:fb:86:d0:d7 | BW678DS78
00:16:fb:86:d0:c5 | JFH76GJH
00:16:fb:87:af:2e | JKKJHD767
00:16:fb:87:af:36 | STF67JG67

где соответственно надо добавить серийник (BW678DS78) в таблицу serial, мак (00:16:fb:86:d0:d7) в таблицу player и связать их друг с другом. Строк в таких файлах может насчитывать несколько тысяч.

А это получается цикл из нескольких тысячей INSERT друг за другом. 

Как можно оптимизировать этот процесс? 



Это сообщение отредактировал(а) martin88 - 3.8.2015, 17:58
Ответ:
Есть 2 таблицы и интерфейс их наполнения:

Код

CREATE TABLE `serial` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `serial` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial` (`serial`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `player` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mac` varchar(255) NOT NULL,
  `serial_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mac` (`mac`),
  UNIQUE KEY `serial_id` (`serial_id`),
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


Проблема в том, что эти две таблицы связаны между собой (serial_id один к одному) и я не могу использовать BULK INSERT (т.к. необходимо сначала вставить запись в одну таблицу, узнав ее PRIMARY KEY, затем вставить запись в другую связанную таблицу используя полученный PRIMARY ID ). 

То есть я делаю парсинг примерно такого файла:

00:16:fb:86:d0:d7 | BW678DS78
00:16:fb:86:d0:c5 | JFH76GJH
00:16:fb:87:af:2e | JKKJHD767
00:16:fb:87:af:36 | STF67JG67

где соответственно надо добавить серийник (BW678DS78) в таблицу serial, мак (00:16:fb:86:d0:d7) в таблицу player и связать их друг с другом. Строк в таких файлах может насчитывать несколько тысяч.

А это получается цикл из нескольких тысячей INSERT друг за другом. 

Как можно оптимизировать этот процесс? 



Это сообщение отредактировал(а) martin88 - 3.8.2015, 17:58
Вопрос: Обновить данные в таблице excel на основе даннх из Access

Уважаемые форумчане.

Помогите пожалуйста решить следующую проблему.

Есть база данных аксес. В базе используется связанная таблица ексель. Данная таблица имеет как-бы ключевое поле уникальное для каждой строки в таблице ексель. Данные из связанной таблицы ежедневно используются через запрос на добавление их в таблицу аксес, и там по всякому используются другими запросами.

Но вот возникла необходимость обновлять ежедневно несколько полей в таблице ексель на основе таблицы акссес так как ето делается в запросах на обновление аксес (UPDATE ТаблицаЕксель.Лист1 INNER JOIN ТаблицаАксес ON ТаблицаЕксель.Лист1.А = ТаблицаАксес.Поле1
SET ТаблицаЕксель.Лист1.В = ТаблицаАксес.Поле2.
Но данные связанной таблицы не редактируются ни в ручную, путем ввода данных, ни запросами на изменение, ни при открытом, ни при закрытом файле ексель.

Подскажите как ето можно сделать.
Заранее благодарен
пс. Офис 2003.
Ответ:
Сообщение от Eugene-LS
по ячейкам большие таблы Excel - отрабатывать довольно долго. Хорошо когда их 200 000 - а если на порядок больше?
Это совершеннейшая правда. Равно как и сложное форматирование больших файлов. Тоже занимает уйму времени.
Вопрос: Связанные таблицы

Мне приходят несколько файлов csv/ xlsx. Каждый файл - будущая таблица в бд.
В файлах нет первичных ключей.
Создаю в access связанные таблицы. Они получаются без первичных ключей.
У всех таблиц(файлов) есть общее поле(текстовое).
По этому полю можно связать таблицы.
Как это сделать?
Ответ:
Сообщение от saikle
Создаю в access связанные таблицы.
Присоединенные таблицы можно связать в схеме данных, без обеспечения целостности, естественно, в запросах. Но обычно такие присоединенные таблицы используются для добавления новых данных в таблицы Аксесса, в которых уже есть ключи. И основная работа уже с этими таблицами.
Вопрос: Создать базу данных ''Служба занятости''

СЛУЖБА ЗАНЯТОСТИ. ПОДСИСТЕМА УЧЕТА ВАКАНСИЙ.
Разрабатываемая подсистема «Учет вакансий» является частью автоматизированной информационной системы «Служба занятости» и решает задачи:
• регистрация работодателей и их требований к кандидатам на вакансию;
• учет вакансий;
• поиск вакансий;
• печать отчетов.
При первичном обращении работодателя для внесения в базу данных информации об организации, необходимо личное присутствие работодателя или его представителя. При регистрации работодателя так же используется регистрационный лист «Сведения о потребности в работниках», в котором необходимо указать информацию о предприятии и требования, предъявляемые к кандидату на вакансию, а именно:
• адрес предприятия, организации;
• фамилия, имя, отчество руководителя;
• адрес непосредственного места работы;
• контактный телефон;
• наименование профессии (должности) в соответствии с ведомственным классификатором;
• сведения об образовании, квалификации, навыках, знаниях, режиме и опыте работы;
• заработная плата, надбавки, премии и т.д.;
• наличие командировок, необходимость работать сверхурочно и в выходные дни.

На основании полученных данных формируются таблицы. По соответствующим запросам печатаются отчеты.
Спроектировать информационную систему учета вакансий в службе занятости.
Ответ:
Сообщение от Владимир51
На основании полученных данных формируются таблицы. По соответствующим запросам печатаются отчеты.
Спроектировать информационную систему учета вакансий в службе занятости.
У тебя всё выше написано, могу скинуть методичку, если нужно)

Добавлено через 1 минуту
Сообщение от Владимир51
«Учет вакансий»
Такая лёгкая база.. Мне вот на практике попалась база "Банк" - вот там много интересного было)
Вопрос: MS Access и, возможно, VBA :копировать данные из таблицы

Помогите чайнику! MS Access 2013
Есть заполненная таблица 1 с полями:
--№, Номер зачетки, ФИО, E-mail, Телефон (ключевое поле "номер зачетки");
и пустая таблица 2 с полями:
--№, Номер зачетки, ФИО, 1 модуль, 2 модуль, ... , Итого.

Необходимо: копировать данные из таблицы 1 (из полей №, Номер зачетки, ФИО) в таблицу 2 (в поля с теми же именами).

Как?? В распоряжении только возможности access и встроенный VBA...
Ответ:
Сообщение от Tesa
Есть заполненная таблица 1 с полями:
--№, Номер зачетки, ФИО, E-mail, Телефон (ключевое поле "номер зачетки");
и пустая таблица 2 с полями:
--№, Номер зачетки, ФИО, 1 модуль, 2 модуль, ... , Итого.
Необходимо: копировать данные из таблицы 1 (из полей №, Номер зачетки, ФИО) в таблицу 2 (в поля с теми же именами).
Как?? В распоряжении только возможности access и встроенный VBA...
SQL
1
INSERT INTO target [(field1[, field2[,]])] [IN externaldatabase]     SELECT [SOURCE.]field1[, field2[,]     FROM tableexpression
SQL
1
2
3
INSERT INTO tbl2([],[Номер зачетки],[ФИО],[1 модуль],[2 модуль], [ Итого]) 
    SELECT [],[Номер зачетки],[ФИО],[соотноси номер столбца],[соотноси номер столбца], [ Итого]
    FROM tab1
SQL
1
... [IN externaldatabase] ...
- это если в другой базе данных
Вопрос: создание формы с изменением данных в таблице - MS Access

Нужно создать таблицу склад(с книгами) и заказов. Вывести запрос на остаток, общее количество книг и затем создать форму с автоматическим изменением данных в таблице "склад" (пыталась, не выходит).
сказали сделать что-то типо чека(в магазине).
Ответ:
ks68
Нужно создать таблицу склад(с книгами) и заказов. Вывести запрос на остаток, общее количество книг и затем создать форму с автоматическим изменением данных в таблице "склад" (пыталась, не выходит).
сказали сделать что-то типо чека(в магазине).


какой тип работы
--производственная
--студенческая

--локальная
--сетевая
Вопрос: История изменения данных в таблице

Здравствуйте.

Подскажите пожалуйста как можно просмотреть историю по изменению данных в таблице к примеру определенного поля?

Спасибо!
Ответ:
Nechto
Здравствуйте.

Подскажите пожалуйста как можно просмотреть историю по изменению данных в таблице к примеру определенного поля?

Спасибо!


CT, CDC
Вопрос: Запрос их нескольких связанных таблиц (один ко многим).

Здравствуйте!
Ни могу разобраться, как получить данные из нескольких, связанных между собой таблиц (один ко многим).
Есть Головная таблица, состоящая из нескольких столбцов:
A1; B2; C3; D4 и т.д.
И есть несколько других таблиц, например, таблица A1.
В таблице A1 имеются свои столбцы.
Как правильно создать запрос, чтобы получить сводную таблицу, где в А1 головной таблицы, поставлялись значения из таблицы A1 и.т.д.

PS. Я новичок. В SQL не нашёл графических запросов, как было в MS Access.
Ответ: что за тип поля A1 в вашей [головной таблице]? оно обязательное или нет?
а в поле id в табличке A1 какие значения?

попробуйте LEFT OUTER JOIN
Вопрос: Вывод данных из связанных таблиц

Добрый день, Уважаемые Форумчане!
Помогите разобраться с одной проблемой.
Есть 3 таблицы, связанные между собой:
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE TABLE table1(
ID INT(11) NOT NULL AUTO_INCREMENT,
Name_table1 varchar(60),
PRIMARY KEY (ID)) ENGINE = InnoDB;
 
CREATE TABLE table2(
ID INT(11) NOT NULL AUTO_INCREMENT,
Name_table2 varchar(60),
ID_table1 INT(11) NOT NULL,
PRIMARY KEY (ID),
FOREIGN KEY (ID_table1) REFERENCES table1(ID)
ON UPDATE CASCADE
ON DELETE CASCADE) ENGINE = InnoDB;
 
 
CREATE TABLE table3(
ID INT(11) NOT NULL AUTO_INCREMENT,
Name_table3 varchar(60),
ID_table1 INT(11) NOT NULL,
PRIMARY KEY (ID),
FOREIGN KEY (ID_table1) REFERENCES table1(ID)
ON UPDATE CASCADE
ON DELETE CASCADE) ENGINE = InnoDB;
Во всех таблицах записаны данные.
Table1
ID|Name_table1
1 |one
2 |two
3 |three

Table2
ID|Name_table2|ID_table1
1 |new |1
2 |old |1
3 |modern |2


Table3
ID|Name_table3|ID_table2
1 |people |2
2 |dogs |2
3 |cat |3


Я пытаюсь получить данные следующим запросом:


MySQL
1
2
3
Select Name_table1, Name_table2, Name_table3 
FROM table1, table2, table3
WHERE table1.ID = 1
В итоге он мне выводит слишком много полей:

Name_table1| Name_table2|Name_table3
one |new |people
one |old |people
one |modern |people
one |new |dogs
one |old |dogs
one |modern |dogs
one |new |cat
one |old |cat
one |modern |cat


А хотелось бы увидеть следующий результат:
Name_table1| Name_table2|Name_table3
one |new |people
one |old |people


И еще вопрос. Как вывести значения при следующем запросе:
MySQL
1
2
3
Select Name_table1, Name_table2, Name_table3 
FROM table1, table2, table3
WHERE table1.ID=table2.ID_table1 and table1.ID = table3.ID_table1 and table1.ID = 3;
Т.к. в таблице table2 ID_table1 = 3 не существует, то вся выборка вышла пустой. А как сделать так, чтобы выводило поля, в которых table1.ID = 3, без учета пустых столбцов?
Хочу увидеть следующий результат:
Name_table1| Name_table2|Name_table3
three | |cat
Ответ: Благодарю за ответ!
А как-нибудь можно совместить 1 и 2 пункты?
Как можно вывести и null строки и без декартова произведения
Выполняю следующий запрос:
MySQL
1
2
3
4
5
SELECT Name_table1, Name_table2, Name_table3
FROM table1
LEFT JOIN table2 ON table1.ID=table2.ID_table1
LEFT JOIN table3 ON table1.ID=table3.ID_table1
where table1.ID=3;
Но в данном запросе декартово произведение остается.
А если прописать к условию что-то типа:
MySQL
1
 where table1.ID=table2.ID_table1 and table1.ID=table3.ID_table1 and table1.ID=3
То выходит пустая таблица.
Вопрос: Запись данных из одной таблицы в несколько связанных таблиц

Здравствуйте!

Прошу помощи.

Как правильно заполнить связанные таблицы в БД из одной таблицы?

Пример:
Есть исходная таблица с данными [dbo].[Table_all] с тремя столбцами
[field_A] [nvarchar](50) NULL,
[field_B] [nvarchar](50) NULL,
[field_C] [nvarchar](50) NULL

Нужно данные из этой таблицы распределить в 3 таблицы:

table_A, table_B, table_C

table_B связана с table_A 1 ко многим
table_C связана с table_B 1 ко многим



+
USE [master]
GO
/****** Object:  Database [testrela]    Script Date: 08.11.2016 16:35:16 ******/
CREATE DATABASE [testrela]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'testrela', FILENAME = N'D:\Data\testrela.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'testrela_log', FILENAME = N'D:\Data\testrela_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [testrela] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [testrela].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [testrela] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [testrela] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [testrela] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [testrela] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [testrela] SET ARITHABORT OFF 
GO
ALTER DATABASE [testrela] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [testrela] SET AUTO_CREATE_STATISTICS ON 
GO
ALTER DATABASE [testrela] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [testrela] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [testrela] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [testrela] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [testrela] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [testrela] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [testrela] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [testrela] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [testrela] SET  DISABLE_BROKER 
GO
ALTER DATABASE [testrela] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [testrela] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [testrela] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [testrela] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [testrela] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [testrela] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [testrela] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [testrela] SET RECOVERY FULL 
GO
ALTER DATABASE [testrela] SET  MULTI_USER 
GO
ALTER DATABASE [testrela] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [testrela] SET DB_CHAINING OFF 
GO
ALTER DATABASE [testrela] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [testrela] SET TARGET_RECOVERY_TIME = 0 SECONDS 
GO
USE [testrela]
GO
/****** Object:  Table [dbo].[table_A]    Script Date: 08.11.2016 16:35:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[table_A](
	[id_table_A] [int] IDENTITY(1,1) NOT NULL,
	[field_A] [nchar](10) NULL,
 CONSTRAINT [PK_table_A] PRIMARY KEY CLUSTERED 
(
	[id_table_A] 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
/****** Object:  Table [dbo].[Table_all]    Script Date: 08.11.2016 16:35:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Table_all](
	[field_A] [nvarchar](50) NULL,
	[field_B] [nvarchar](50) NULL,
	[field_C] [nvarchar](50) NULL
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[table_B]    Script Date: 08.11.2016 16:35:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[table_B](
	[id_table_B] [int] IDENTITY(1,1) NOT NULL,
	[field_B] [nchar](10) NULL,
	[link_table_A] [int] NOT NULL,
 CONSTRAINT [PK_table_B] PRIMARY KEY CLUSTERED 
(
	[id_table_B] 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
/****** Object:  Table [dbo].[table_C]    Script Date: 08.11.2016 16:35:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[table_C](
	[id_table_C] [int] IDENTITY(1,1) NOT NULL,
	[field_C] [nchar](10) NULL,
	[link_table_B] [int] NOT NULL,
 CONSTRAINT [PK_table_C] PRIMARY KEY CLUSTERED 
(
	[id_table_C] 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
INSERT [dbo].[Table_all] ([field_A], [field_B], [field_C]) VALUES (N'okr1', N'ray1', N'kv1')
INSERT [dbo].[Table_all] ([field_A], [field_B], [field_C]) VALUES (N'okr1', N'ray2', N'kv1')
INSERT [dbo].[Table_all] ([field_A], [field_B], [field_C]) VALUES (N'okr2', N'ray1', N'kv1')
/****** Object:  Index [IX_table_C]    Script Date: 08.11.2016 16:35:16 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_table_C] ON [dbo].[table_C]
(
	[id_table_C] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[table_B]  WITH CHECK ADD  CONSTRAINT [FK_table_B_table_A] FOREIGN KEY([link_table_A])
REFERENCES [dbo].[table_A] ([id_table_A])
GO
ALTER TABLE [dbo].[table_B] CHECK CONSTRAINT [FK_table_B_table_A]
GO
ALTER TABLE [dbo].[table_C]  WITH CHECK ADD  CONSTRAINT [FK_table_C_table_B] FOREIGN KEY([link_table_B])
REFERENCES [dbo].[table_B] ([id_table_B])
GO
ALTER TABLE [dbo].[table_C] CHECK CONSTRAINT [FK_table_C_table_B]
GO
USE [master]
GO
ALTER DATABASE [testrela] SET  READ_WRITE 
GO
Ответ: Нумеруете строки общей таблицы, затем используете вставку с output, получаете таблицу связей между номерами и идентификаторами таблицы В. Используете это для вставки в таблицу С ( а(id)+output=ID(b) ).
Как-то так.

Если напрямую output из разных таблиц не удастся собрать, то можно попробовать merge(b) вместо insert(b).